2012-04-28 64 views
9

我想使用Java MapReduce在Hadoop中跨兩個數據集執行跨產品的昂貴操作。MapReduce中的交叉產品

例如,我有來自數據集A和數據集B的記錄,並且我希望數據集A中的每條記錄都匹配到輸出中數據集B中的每條記錄。我意識到,這將是|A| * |B|的輸出大小,但想要做它反正。

我看到Pig有CROSS但我不知道它是如何在高層實現的。也許我會去看看源代碼。

不尋找任何代碼,只是想知道在高層我應該如何處理這個問題。

+0

您是否可以將A的全部或全部B放入一個工作人員的記憶中?然後它非常簡單。 – 2012-04-28 18:37:25

+0

@SeanOwen我希望!不幸的是,這種情況並非如此。我在考慮的一種方法是將數據集B分成10-100左右的分組,然後一次運行10-100個不同的mr作業。 – 2012-04-28 19:12:26

回答

3

在查看文檔相似性(將文檔與其他文檔進行比較)時,我做了類似的事情,並以自定義輸入格式結束了兩個數據集,然後確保每個子集都有一個「分割」數據。

所以,你的分裂會是什麼樣子(每個合併兩套10條記錄,輸出100條記錄)

A(1-10) x B(1-10) 
A(11-20) x B(1-10) 
A(21-30) x B(1-10) 
A(1-10) x B(11-20) 
A(11-20) x B(11-20) 
A(21-30) x B(11-20) 
A(1-10) x B(21-30) 
A(11-20) x B(21-30) 
A(21-30) x B(21-30) 

我不記得是怎麼高性能是,雖然,但有一個文檔中的大小順序設置成千上萬的數據進行比較(在8節點開發集羣上),並計算出數以百萬計的交叉產品。

我也可以對算法進行改進,因爲有些文檔對其他人來說不會得到很好的分數(如果他們之間有太多的時間間隔),並且產生更好的分割效果。

+0

這太棒了。非常乾淨,因爲它的所有配對都是由輸入格式完成的。謝謝! – 2012-04-28 20:09:48

+0

@克里斯這是美妙的方法。我想知道如果你可以分享你如何編寫「自定義輸入格式」或可能是代碼。這將有所幫助。 – 2012-04-30 02:44:55

+0

@justinwaugh - 我會看看如果我可以挖掘出一些東西,並寫上博客文章,我一定會從這裏鏈接它 – 2012-04-30 13:23:07