2010-05-12 54 views

回答

7

地图边加入

在地图端(片段重复)加入,你保留在内存中一个数据集(中说哈希表)和加入其他的数据集,记录逐记录。在猪,你会写

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中,对于标准连接,通过将最大的数据集最后完成。 (与片段复制连接相反,内存数据集最后给出)。

请注意,对于地图端联接,较小数据集的整体必须适合内存。在标准的reduce方联接中,只有每个键的组必须适合内存(实际上除了最后一个键外,每个键的组)。甚至可以避免这种限制,但需要小心;例如在Pig中的skewed join

合并加入

最后,如果两个数据集存储在总的排序顺序上的连接键,你可以做在地图上侧的合并连接。与缩减端连接相同,您可以对连接键执行合并排序,然后在对上进行投影(拼合)。

正因为如此,当生成一个经常读取的数据集时,在最后一遍中进行全面排序通常是一个好主意。 Zebra和其他数据库也可能为您提供(几乎)免费的总分类输入。

0

Hadoop的这些连接都是合并连接,它们需要事先进行(明确)排序。另一方面,哈希联接不需要排序,而是通过一些哈希函数对数据进行分区。 详细的讨论可以在Jimmy Lin和Chris Dyer的Data-Intensive Text Processing with MapReduce的“关系连接”一节中找到,这本书是一本免费且开源的书。