2016-06-17 32 views
2

我有發出文本(水果名)鍵和一個自定義的複合值城市映射器:計數。我想在複合值到達減速器之前通過計數對複合值進行排序,以便減速器可以快速確定哪個城市的計數最高。Java的MapReduce的排序組合值

的複合值類是WritableComparable的延伸,並且具有用於檢索計數和城市方法。

什麼我減速當前接受:

reducer 1 - oranges:<london:2, chicago:15, charleston:6> 
reducer 2 - apples:<charleston:31, london:3, chicago:29> 
... 

我希望我的減速器收到什麼:

reducer 1 - oranges:<chicago:15, charleston:6, london:2> 
reducer 2 - apples:<charleston:31, chicago:29, london:3> 

從邏輯上講,我怎麼做到這一點?我讀過幾篇有關Secondary Sorting/Ordering的文章,但他們傾向於關注複合鍵而不是複合值。我的密鑰不需要進一步分區,也不需要進一步分類。

此外,通過複合VALUE不是複合鍵排序!

+0

的可能的複製[hadoop的地圖減少二次分選(http://stackoverflow.com/questions/18395998/hadoop-map-reduce-secondary-sorting) –

回答

1

如果只瞄準快速測定水果的最高金額的我想推薦的另一種方法。因爲在大多數情況下,分揀擁有的O(n log n)複雜性,同時發現最大的條目只有O(n)其中n你的情況的城市數量。

1.映射器,內存

您可以使用HashMap中的每個映射器,以確定每個映射每個水果的最高金額。只需使用水果作爲關鍵和城市+計數作爲價值。當你看到地圖上的水果,比較大的時候。如果水果不存在,你顯然必須設置它。 當所有的地圖步驟都被執行時,框架會調用你的映射器的清理方法。在清理中,您可以發出地圖的條目。這將減少你必須在減速器中顯着發送和通過的值的數量。

2.合

的方法1.有一個顯著退。如果你有大量的水果不適合記憶,它是不可擴展的。如果是這種情況,您可以使用在映射器端執行的組合器。它對於相應的映射器給出的一組較小的數據就像一個簡化器一樣工作。這也可以減少發送給減速器的數量。

3.二次訂貨

你可以用二次訂貨做到這一點。我真的很想鼓勵你閱讀Preeti Khurana提供的文章。特別是answer of Sudarshan。給你一個簡要的想法:使用水果的複合關鍵:count和city:count的值。請注意,您需要基於密鑰的第一部分進行特殊分區。我認爲這將是一個很大的努力,但在某些情況下,這是有用的和必要的。