2012-09-12 22 views
0

數據中的每個線有以下格式:MapReduce的設計

用戶ID,性別,年齡

我們需要回答以下兩個問題:

1)有多少男性&多少女性。

2)50多年多少年& 50歲以下的人數。

有沒有辦法在單個Map Reduce作業中回答這兩個問題?我知道我可以在兩個單獨的MR作業中輕鬆完成此操作,但是希望避免兩次讀取同一個文件。我只能在一個MR工作中如何做到這一點?

回答

1

在地圖階段您可以對每條記錄輸出2個鍵:

  • 年輕/老
  • 男/女

與數1作爲減少相位值和總和這將給你你正在尋找的4個值,或者輸出1個組合信息的關鍵:

  • youn gmale/oldmale/youngfemale/oldfemale

計數1在縮小階段加起來,給你4個組合值,你可以通過添加計數對來得到你想要的答案。

0

假設你的映射器的輸出到減速機就像是context.write(CONSTANT_KEY, VALUE);其中,key是一個常數,而值是一個連接字符串"X,Y"X可以保持1值{1,0},其中1代表男性& 0代表女性。 Y可以保持1值{1,0},其中1代表年齡> 50 & 0代表年齡< 50.現在在Reducer類中,可以很容易地計算字段X的1和0的數量& Y使用StringTokenizer類。唯一的缺點是,因爲KEY是恆定的,所以只有一個reducer。

+0

使用常量鍵發送所有輸出不是一個好主意。您不能組合中間k,v對,這意味着您的帶寬使用量要大得多,並且所有密鑰都會轉到同一個Reducer,這意味着您將單個節點超載,而不是在可用節點之間分割工作。 – HypnoticSheep

0

我想我回答了我自己的問題。以下是可行的,對吧?

映射:

if (Male) 
    emit("Male", 1) 
else 
    emit("Female", 1) 

if (Age > 50) 
    emit("Over 50", 1) 
else 
    emit("Under 50", 1) 

現在這些將前往4輪不同的減速機有4個不同的密鑰: 「男」, 「女」, 「超過50個」 & 「在50」,還有我的回答,對吧?

+0

是的,這是我描述的第一個選項,第二個選項的缺點是必須爲每個輸入記錄發出2個鍵。 – rsp

+0

我建議使用@rsp的第二個選項來節省帶寬。如果你要對Reducer中的數據進行大量處理,我會建議第一個選項。這是一個平衡帶寬使用和處理時間的問題,請選擇最適合您的工作。 – HypnoticSheep

+0

明白了!謝謝@rsp&HypnoticSheep – DilTeam