Python Map减少了先生的工作

时间:2018-03-16 15:55:08

标签: python hadoop mapreduce max mrjob

我是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:'实现它的方式是不正确的,因为mapper始终将该字符串发送到减速机。有人可以确认这是不正确的实现方式,并建议我如何解决它?

1 个答案:

答案 0 :(得分:0)

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

在这种情况下,您只需从映射器发送None作为键,然后添加到reducer的输出中,无论您认为哪个更好地描述了最终结果,在这种情况下,最大数量。

我会建议这种做法。 (我冒昧地改变了一些变量名来澄清代码的作用)

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

我希望你发现这个答案不仅可以用来编写正确的代码,还可以编写你感觉更舒服的代码。