HIVE - 桶连接的用例是什么

时间:2013-06-19 16:04:38

标签: join hadoop hive buckets

我似乎无法在蜂巢中找到任何用于桶加入的好用例 正如我所看到的,当将表A与表B连接时:
在将表B加载到分布式缓存中时,存储桶连接为我们节省了将表A传递给reducer的时间,并且每个映射器处理表B的相应存储桶与表A的存储桶。

但是,将表B加载到分布式缓存中是由单个任务完成的,因此随着表变大,这成为瓶颈。
因此,如果表B足够小而不会对单个任务造成负担,那么它与使用小优化进行常规地图连接几乎相同。

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

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

总而言之,我认为问题是成本更高:

  1. 通过单个任务将中等大小的表加载到分布式缓存中
  2. 将很多中等(可能很大)的大小桶从映射器传递到Reducer(主要是本地)并合并2个文件 - 所有这些都是并行完成的。
  3. 您怎么看?有人能找到一个很好的用法来加入吗?

1 个答案:

答案 0 :(得分:0)

我认为你将bucket join与mapjoin混淆了。 在映射连接中,较小的表被加载到分布式缓存中,假设它足够小,并且它被发送到所有映射器。有1到N的对应关系。

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

相关问题