2013-06-19 28 views
0

我似乎无法为存储桶加入配置单元找到任何好的用例。
正如我所看到的,当将表A连接到表B时:
在将表B加载到分布式缓存中并且每个映射器处理相应的表B的桶时,桶连接为我们节省了将表A传递给减速器的时间,表A的桶。HIVE - 存储桶加入的用例是什么

但是,表B到分布式缓存中的加载是由单个任务完成的,因此当表变得更大时,这成为瓶颈。
所以,如果表B足够小,不会给一个任务带来负担,它实际上就像做一个常规的地图一样 - 通过一个小的优化加入。

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

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

最后,我认为这个问题是什么花费更多:

  1. 装入一个中等大小的表到分布式缓存由单一任务
  2. 从路过很多中等(可能大)的大小水桶映射到reducer(大部分是本地)和合并2个文件 - 全部并行完成。

您怎么看?有人可以找到一个很好的用法来桶加入?

回答

0

我认为你很困惑与地图加入斗连接。 在映射连接中,较小的表被加载到分布式缓存中,假设它足够小,并且它被发送到映射器。有1对N的对应关系。

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

+0

你指的是排序合并存储桶连接,因为我在谈论常规存储池连接。 Sort-merge当然有很多很好的用法。 – dimamah