![](/img/trans.png)
[英]calculate median of a list of values parallely using Hadoop map-reduce
[英]Map-Reduce/Hadoop sort by integer value (using MRJob)
这是简单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-bytes'开头,以便每个数字中的字节数与最大数字中的字节数相同。 至少那是我在课堂上记得的东西。 我现在无法添加答案,因为它不允许我这样做,但这是我唯一的解决方案。 如果有人能获得更透明,更轻松的信息,请分享。
简单的解决方案(更强大的功能可能是基于调整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])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.