【问题标题】:Map-Reduce/Hadoop sort by integer value (using MRJob)Map-Reduce/Hadoop 按整数值排序(使用 MRJob)
【发布时间】:2013-11-23 00:15:52
【问题描述】:

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

【问题讨论】:

  • 那么这个python脚本实际上为整个集群创建了一个mapreduce作业? ..我在使用Python Script编写map reduce时通常使用Hadoop Streaming ..
  • 嗯,我不确定,但是可以。这就是MRJob 启用的功能。你可以在这里阅读更多相关信息——pythonhosted.org/mrjob

标签: python sorting hadoop mapreduce mrjob


【解决方案1】:

简单的解决方案(更健壮的可能基于调整 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])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多