2012-09-15 31 views
2

我現在有交易有以下的列的列表:在1計數多個按鍵的MapReduce

TradeID, SellerID, FishType, Price, Qty 

我希望得到

  1. 每個SellerID
  2. 的的計數數量每個魚類型號

目前,我已經寫輸出< FishType數量>映射器以便總結數量每個FishType。但是,要獲得SellerID的計數,是否必須編寫單獨的mapreduce任務?還是有一種方法讓我在同一個mapreduce任務中這樣做?

我已經考慮過使用計數器,但是在編碼的時候,記錄中的sellerID在我看來是未知的,並且可能有太多無法跟蹤使用計數器。在我看來,這也是對Counter功能的濫用。

請指教。

回答

4

做到這一點的顯而易見的方法是有一個單獨的mapreduce作業。

執行此操作的一個棘手方法是「超載」您的密鑰。我猜SellerIDFishType都是字符串。當它是SellerID時,將"S:"添加到字符串的前面,並且FishType"F:"添加到字符串的前面。

然後,當你到達減速機,你會得到兩種不同類型的reduce函數調用的一個:它開始"S:",在這種情況下,它是一個SellerID,和一個在那裏它開始"F:",在這種情況下它是FishType。根據這一觀察,你在減速器中有單獨的邏輯。

最後,使用MultipleOutputs(小心.mapred..mapreduce.版本,它們互不兼容)將結果寫出來,希望兩個不同的目錄:一個用於FishType,一個用於SellerID


您可能想爲此使用Pig或Hive。

+0

我一直在想你的「前綴」解決方案。雖然我不明白爲什麼這不起作用,但我擔心它是否實際上破壞了MapReduce框架的整體目的。由於該框架將不能對中間密鑰進行正確的分組和排序,即,這些密鑰基本上不是由FishType或SellerID排序的,所以這些密鑰將不會連續地饋送到縮減器中,因此導致分離的輸出。 – Deyang

+1

「F:Salmon」所有的東西都會發送到同一個減速器,並且會一起分析。這是你脫節的意思嗎?你在這裏所做的只是重載鍵空間來一次執行兩個任務。 –

+0

啊,你是對的。仍然試圖將我的頭圍繞整個mapreduce框架。謝謝。 – Deyang