map reduce/hadoop按整数值排序(使用mrjob)

brvekthn  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(310)

这是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字节”,以便每个数字中的字节数与最大数字中的字节数相同。至少这是我在课堂上记得的。我现在不能添加答案,因为它不允许我,但这是我唯一的解决办法。如果有人有更透明和简单的东西,请分享。

zfciruhq

zfciruhq1#

简单的解决方案(更健壮的可能是基于调整hadoop如何对Map器输出进行排序)

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])

相关问题