2013-11-23 140 views
1

這是一個簡單的Map-Reduce排序功能的MRJob實現。在beta.pyMap-Reduce/Hadoop按整數值排序(使用MRJob)

from mrjob.job import MRJob 

class Beta(MRJob): 
    def mapper(self, _, line): 
     """ 
     """ 
     l = line.split(' ') 
     yield l[1], l[0] 

    def reducer(self, key, val): 
     yield key, [v for v in val][0] 


if __name__ == '__main__': 
    Beta.run() 

我運行使用文本吧:

1 1 
2 4 
3 8 
4 2 
4 7 
5 5 
6 10 
7 11 

人們可以使用這條命令:

cat <filename> | python beta.py 

現在的問題是輸出的排序假設關鍵是類型爲string(這可能就是這種情況)。輸出是:

"1"  "1" 
"10" "6" 
"11" "7" 
"2"  "4" 
"4"  "2" 
"5"  "5" 
"7"  "4" 
"8"  "3" 

,我想輸出是:

"1"  "1" 
"2"  "4" 
"4"  "2" 
"5"  "5" 
"7"  "4" 
"8"  "3" 
"10" "6" 
"11" "7" 

我不知道這是否與在MRJob協議擺弄作爲協議的具體工作,而不是一步具體的事情。

編輯(解決方案):我已經得到了答案。這個想法是需要在每個數字前面加上'O-bytes',這樣每個數字中的字節數與最大數字中的字節數相同。至少這是我從班上記得的。我現在不能添加答案,因爲它不會允許我,但這是我唯一的解決方案。如果有人有更透明和容易的事情,請分享。

+0

所以這一個python腳本實際上創建爲整個集羣MapReduce工作(更強大的可能Hadoop是如何排序映射輸出基於調整)? ..我通常使用Hadoop Streaming時使用Python腳本來寫地圖減少.. –

+0

嗯,我不知道,但是,是的,它可以。這就是'MRJob'啓用的功能。你可以在這裏閱讀更多關於它的內容 - http://pythonhosted.org/mrjob/。 – p0lAris

回答

2

簡單的解決方案

class Beta(MRJob): 

    def mapper (self, _, line): 
     l = line.strip('\n').split() 
     yield '%010d'%int(l[1]), l[0] 

    def reducer(self, key, values): 
     yield int(key),int(list(values)[0])