这是一个简单的Map-Reduce排序功能的MRJob实现。在beta.py
:
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字节”,以使每个数字中的字节数与最大数字中的字节数相同。至少那是我在课堂上记得的。我现在无法添加答案,因为它不允许我,但这是我得到的唯一解决方案。如果有人有更透明和容易的东西,请分享。
答案 0 :(得分:2)
简单的解决方案(更强大可能基于调整Hadoop如何对映射器输出进行排序)
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])