这是mrjob实现的一个简单的map reduce排序功能。在 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字节”,以便每个数字中的字节数与最大数字中的字节数相同。至少这是我在课堂上记得的。我现在不能添加答案,因为它不允许我,但这是我唯一的解决办法。如果有人有更透明和简单的东西,请分享。
1条答案
按热度按时间zfciruhq1#
简单的解决方案(更健壮的可能是基于调整hadoop如何对Map器输出进行排序)