我是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始终将该字符串发送到减速机。有人可以确认这是不正确的实现方式,并建议我如何解决它?
答案 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()
我希望你发现这个答案不仅可以用来编写正确的代码,还可以编写你感觉更舒服的代码。