2012-06-16 55 views

回答

6

要做一個自我加入,你可以按照「reduce-side join」模式。映射器將加入/外鍵作爲鍵發出,將記錄作爲值發出。

所以,我們說我們想要做的「城市」以下數據(中間列)自聯接:

don,baltimore,12 
jerry,boston,19 
bob,baltimore,99 
cameron,baltimore,13 
james,seattle,1 
peter,seattle,2 

映射器會發出鍵 - >值對:

(baltimore -> don,12) 
(boston -> jerry,19) 
(baltimore -> bob,99) 
(baltimore -> cameron,13) 
(seattle -> james,1) 
(seattle -> peter,2) 

在減速,我們會得到這樣的:

(baltimore -> [(don,12), (bob,99), (cameron,13)]) 
(boston -> [(jerry,19)]) 
(seattle -> [(james,1), (peter,2)]) 

從這裏,你可以做內部聯接的邏輯,如果你選擇。要做到這一點,你只需要爲每個其他項目匹配每個項目。爲此,請將數據加載到數組列表中,然後對項目執行N×N循環以相互比較每個項目。

認識到減少方面的聯接是昂貴的。如果你不過濾任何東西,他們幾乎可以將所有數據發送到減速器。另外,請小心將數據加載到reducer中的內存中 - 通過將所有數據加載到數組列表中,您可以將熱堆放在熱連接鍵上。


以上與典型的縮小側連接有點不同。加入兩個數據集時的想法是相同的:外鍵是關鍵,記錄是值。唯一的區別是這些值可能來自兩個或更多數據集。您可以使用MultipleInputs讓不同的映射器解析不同的輸入集,然後讓reducer從兩者收集數據。


在沒有任何限制的情況下交叉產品是一場噩夢。即,

select * from tablea, tableb; 

有很多方法可以做到這一點。它們都不是特別有效。如果你想要這種行爲,留下評論,我會花更多的時間來解釋這種做法。

如果你可以找出某種類似的連接鍵,這是相似性的基本關鍵,你會好得多。


即插即用我的書:MapReduce Design Patterns。它應該在幾個月內發佈,但如果您真的感興趣,我可以通過電子郵件發送關於連接的章節。

0

通常使用reducer來執行連接所需的任何邏輯。訣竅是將數據集映射兩次,可能會將某個標記添加到指示它是哪個運行的值。然後,自連接與其他任何類型的連接沒有區別。