2010-05-12 56 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的「關係連接」一節中找到,這本書是一本免費且開源的書。