Hadoop的Map-side join实现了Hash join?

时间:2010-05-12 22:47:19

标签: join hash hadoop

我尝试在Hadoop中实现Hash join。

但是,Hadoop似乎已经实现了地图侧连接和缩减端连接。

这些技术和散列连接有什么区别?

2 个答案:

答案 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中的“关系联接”一节中找到,这是一本写得很好的免费开源书。