Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Join 配置单元-bucket连接的用例是什么_Join_Hadoop_Hive_Buckets - Fatal编程技术网

Join 配置单元-bucket连接的用例是什么

Join 配置单元-bucket连接的用例是什么,join,hadoop,hive,buckets,Join,Hadoop,Hive,Buckets,在hive中,我似乎找不到任何好的bucket join用例。 在我看来,当将表A与表B连接起来时: bucket连接节省了我们将表A传递给缩减器的时间,同时将表B加载到分布式缓存中,每个映射器处理表B对应的bucket与表A对应的bucket 但是,将表B加载到分布式缓存是由单个任务完成的,因此,随着表变得越来越大,这将成为一个瓶颈。 因此,如果表B足够小,不足以负担单个任务,那么它实际上与使用小优化进行常规映射联接一样 另一方面,如果表B不能装入单个映射器,那么将其读取到分布式缓存的过程可能

在hive中,我似乎找不到任何好的bucket join用例。
在我看来,当将表A与表B连接起来时:
bucket连接节省了我们将表A传递给缩减器的时间,同时将表B加载到分布式缓存中,每个映射器处理表B对应的bucket与表A对应的bucket

但是,将表B加载到分布式缓存是由单个任务完成的,因此,随着表变得越来越大,这将成为一个瓶颈。
因此,如果表B足够小,不足以负担单个任务,那么它实际上与使用小优化进行常规映射联接一样

另一方面,如果表B不能装入单个映射器,那么将其读取到分布式缓存的过程可能需要一段时间

最后,似乎将表B加载到分布式缓存中的时间是值得的,因为我们不需要将表A的存储桶从映射器传递到还原器,但是这个过程不应该太重,除非表A真的很大,因为每个映射器将读取对应于单个还原器的单个存储桶(表由join键绑定)每个reducer获取2个中间输出(每个表一个,reducer与对应的映射器运行在同一个节点上的可能性不错),并合并它们,从这一点开始,连接与映射器中的连接相同

总之,我认为问题是什么成本更高:

  • 通过单个任务将中等大小的表加载到分布式缓存中
  • 将大量中等大小(可能较大)的bucket从映射器传递到还原器(大部分是本地的),并合并2个文件——所有这些都是并行完成的

  • 你怎么看?有人能找到bucket join的好用法吗?

    我认为你把bucket join和mapjoin混淆了。 在映射连接中,较小的表被加载到分布式缓存中(假设它足够小),并发送给所有映射者


    在bucket连接中,您将连接两个大表,这两个表都以相同的方式存储数据:在N个bucket(文件)中,按您要加入的同一列进行装箱和排序。因此表A有N个bucket,表B也有N个bucket,因此您可以将排序bucket#1与bucket#1与B、2与#2等合并。这是1对1的对应,N次。这也在地图端完成,但不涉及分布式缓存。

    您指的是排序合并bucket join A我刚才说的是常规的bucket连接。当然,排序合并bucket连接有很多很好的用法。。