數據中的每個線有以下格式:MapReduce的設計
用戶ID,性別,年齡
我們需要回答以下兩個問題:
1)有多少男性&多少女性。
2)50多年多少年& 50歲以下的人數。
有沒有辦法在單個Map Reduce作業中回答這兩個問題?我知道我可以在兩個單獨的MR作業中輕鬆完成此操作,但是希望避免兩次讀取同一個文件。我只能在一個MR工作中如何做到這一點?
數據中的每個線有以下格式:MapReduce的設計
用戶ID,性別,年齡
我們需要回答以下兩個問題:
1)有多少男性&多少女性。
2)50多年多少年& 50歲以下的人數。
有沒有辦法在單個Map Reduce作業中回答這兩個問題?我知道我可以在兩個單獨的MR作業中輕鬆完成此操作,但是希望避免兩次讀取同一個文件。我只能在一個MR工作中如何做到這一點?
在地圖階段您可以對每條記錄輸出2個鍵:
與數1作爲減少相位值和總和這將給你你正在尋找的4個值,或者輸出1個組合信息的關鍵:
計數1在縮小階段加起來,給你4個組合值,你可以通過添加計數對來得到你想要的答案。
假設你的映射器的輸出到減速機就像是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。
我想我回答了我自己的問題。以下是可行的,對吧?
映射:
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」,還有我的回答,對吧?
是的,這是我描述的第一個選項,第二個選項的缺點是必須爲每個輸入記錄發出2個鍵。 – rsp
我建議使用@rsp的第二個選項來節省帶寬。如果你要對Reducer中的數據進行大量處理,我會建議第一個選項。這是一個平衡帶寬使用和處理時間的問題,請選擇最適合您的工作。 – HypnoticSheep
明白了!謝謝@rsp&HypnoticSheep – DilTeam
使用常量鍵發送所有輸出不是一個好主意。您不能組合中間k,v對,這意味着您的帶寬使用量要大得多,並且所有密鑰都會轉到同一個Reducer,這意味着您將單個節點超載,而不是在可用節點之間分割工作。 – HypnoticSheep