【问题标题】:Python Map Reduce Mr jobPython Map Reduce Mr 工作
【发布时间】:2018-03-16 15:55:07
【问题描述】:

我是 python 编程的新手,所以如果我问一些容易解决的问题,请提前原谅。我想使用MapReduce 处理具有一些值的csv 文件,并且输出必须返回最大值。这是我到目前为止编写的脚本:

from mrjob.job import MRJob

class MRWordCounter(MRJob):
def mapper(self, key, line):
    for word in line.split(','):
        yield 'MAXIMUM VALUE IN FILE:',int(word)


def reducer(self, word, occurrences):
    yield word, max(occurrences)


if __name__ == '__main__':
     MRWordCounter.run()

现在,脚本工作正常,它映射并减少到最大值并将其打印为输出,但我认为我使用 yield 'MAXIMUM VALUE IN FILE:' 实现它的方式是不正确的,因为映射器总是将该字符串发送到减速器.有人可以确认这是否是实施它的错误方法并推荐我如何解决它吗?

【问题讨论】:

    标签: python hadoop mapreduce max mrjob


    【解决方案1】:

    你的方法是正确的。正如您所提到的,映射器始终将MAXIMUM VALUE IN FILE: 作为减速器的唯一键发送,这意味着它与此阶段的工作无关。请记住,映射器仅对最终目标进行一些桥接操作。不要以此为标准,但在我看来,就代码的可读性而言,映射的值不是文件中的最大值,因此不应使用键 MAXIMUM VALUE IN FILE: 标记它们。只有 reducer 知道哪个是最大数,所以这个 answer 应该被 reducer 包裹起来,标记最终结果。

    在这种情况下,您可以将 None 作为映射器的键发送,然后将您认为更好地描述最终结果的任何内容添加到减速器的输出中,在这种情况下,最大数量。

    我建议改用这种方法。 (我冒昧地更改了一些变量名以阐明代码的作用)

    from mrjob.job import MRJob
    
    
    class MRFindMax(MRJob):
    
      def mapper(self, _, line):
        for number in line.split(','):
          yield None, int(number)
    
      # Discard key, because it is None
      # After sort and group, the output is only one key-value pair (None, <all_numbers>)
      def reducer(self, _, numbers):
        yield "Max value is", max(numbers)
    
    
    if __name__ == '__main__':
      MRFindMax.run()
    

    我希望您发现此答案不仅对编写正确的代码有用,而且对编写您感觉更舒服的代码很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-27
      • 2014-11-04
      • 2020-03-09
      • 2012-04-09
      • 2021-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多