我尝试在Hadoop中实现Hash join。
但是,Hadoop似乎已经实现了地图侧连接和缩减端连接。
这些技术和散列连接有什么区别?
答案 0 :(得分:7)
地图端加入
在地图侧(片段复制)连接中,您将一个数据集保存在内存中(例如哈希表)并连接到另一个数据集,逐个记录。在Pig,你会写
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中,对于标准连接,您可以通过最后放置最大数据集来实现此目的。 (与片段复制连接相反,最后给出内存数据集。)
请注意,对于地图侧连接,较小数据集的 whole 必须适合内存。在标准的缩减侧连接中,只有每个键的组必须适合内存(实际上每个键的组除了最后一个)。甚至可以避免这种限制,但需要小心;例如,在Pig的skewed join中查找。
合并加入
最后,如果两个数据集都以连接键的总排序顺序存储,则可以在地图侧进行合并连接。与reduce-side join相同,你对连接键进行合并排序以进行cogroup,然后在对上进行投影(展平)。
因此,在生成经常读取的数据集时,通常最好在最后一次传递中进行总排序。 Zebra和其他数据库也可以为(几乎)免费提供总排序输入。
答案 1 :(得分:0)
Hadoop的这两个连接都是合并连接,需要预先进行(显式)排序。 另一方面,散列连接不需要排序,而是通过一些散列函数来分区数据。 详细的讨论可以在Jimmy Lin和Chris Dyer的Data-Intensive Text Processing with MapReduce中的“关系联接”一节中找到,这是一本写得很好的免费开源书。