繁体   English   中英

Map-Reduce / Hadoop按整数值排序(使用MRJob)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM