我尝试在Hadoop中实现Hash join.
但是,Hadoop似乎已经实现了地图侧连接和缩减侧连接.
这些技术和散列连接有什么区别?
地图边加入
在地图侧(片段 - 复制)连接中,您将一个数据集保存在内存中(例如哈希表)并连接到另一个数据集,逐个记录.在猪,你会写
edges_from_list = JOIN a_follows_b BY user_a_id, some_list BY user_id using 'replicated';
注意右边的小数据集.这非常有效,因为没有网络开销和最小的CPU需求.
减少加入
在缩减端连接中,使用hadoop的标准合并排序对连接键进行分组.
<user_id   {A, B, F, ..., Z},  { A, C, G, ..., Q} >
并使用第二组中的元素为第一组中的每一对元素发出一条记录:
[A   user_id    A]
[A   user_id    C]
...
[A   user_id    Q]
...
[Z   user_id    Q]
您应该设计密钥,以便每个密钥记录最少的数据集首先出现 - 您需要将第一个组保留在内存中并将第二个组流过它.在Pig中,对于标准连接,您可以通过最后放置最大的数据集来实现此目的.(与片段复制连接相反,最后给出内存数据集).
请注意,对于地图侧连接,整个较小数据集必须适合内存.在标准的缩减侧连接中,只有每个键的组必须适合内存(实际上每个键的组除了最后一个).甚至可以避免这种限制,但需要小心; 例如在Pig 的偏斜连接中查找.
合并加入
最后,如果两个数据集都以连接键的总排序顺序存储,则可以在地图侧执行合并连接.与reduce-side连接相同,您在连接键上进行合并排序以进行cogroup,然后在对上进行投影(展平).
因此,在生成频繁读取的数据集时,通常最好在最后一次传递中进行总排序.Zebra和其他数据库也可以为(几乎)免费提供总排序输入.