![](/img/trans.png)
[英]How to do a Reduce Side Join as a Map Reduce Job with mrjob in Python
[英]Python Map Reduce Mr job
我是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()
现在,脚本可以正常工作,可以映射并减小到最大值并将其打印为输出,但是我认为我使用'MAXIMUM VALUE IN FILE:'
实现它的方式是错误的,因为映射器始终将字符串发送给减速器。 有人可以确认这是否是错误的实现方式,并向我推荐如何解决该问题吗?
您的方法是正确的。 如您所提到的,映射器始终将“ MAXIMUM VALUE IN FILE:
作为唯一的密钥发送给reducer,这意味着它在此阶段与作业无关。 请记住,映射器只会对最终目标进行一些桥接操作。 不要将此作为标准,但是我认为,就代码的可读性而言,映射的值不是文件中的最大值,因此不应使用关键字MAXIMUM VALUE IN FILE:
标记它们。 只有化简器知道最大的数,因此应由化简器包装答案,并标记最终结果。
在这种情况下,您可以只从映射器发送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()
我希望您发现此答案不仅对编写正确的代码有用,而且对您更熟悉的代码有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.