我在mrjob mareduce框架中遇到了一个简单的问题: 我想在给定的Parragraph中获取平均单词数,我得到了这个:
class LineAverage(MRJob):
def mapper(self, _, line):
numwords = len(line.split())
yield "words", numwords
yield "lines", 1
def reducer(self, key, values):
yield key, sum(values)
使用此代码,我得到了reduce过程,文本中行和单词的总和,但我不知道如何通过执行以下操作获得平均值:
words/TotalOfLines
我是这种编程模型的新手,如果有人可以说明这个例子,将不胜感激。
同时,非常感谢您的关注和参与
毕竟,答案很简单:我实际上向化简器发送了等于行数的值。因此,在化简器中,我只需要计算键的值数。
class LineAverage(MRJob):
def mapper(self, _, line):
numwords = len(line.split())
yield "words", numwords
def reducer(self, key, values):
i,totalL,totalW=0,0,0
for i in values:
totalL += 1
totalW += i
yield "avg", totalW/float(totalL)
因此映射器为每行发送一对("words",x),洗牌过程将产生一个元组:("words":x1,x2,x3,..xnumberOfLines),这是化简器的输入,然后我只需要计算键的值数,就是这样,我得到了行数。
希望对某人有帮助。
在 reducer 中,您已经将键 sum(values) 输出到输出文件。您只需要将输出文件读取到Java/Scala程序中并计算平均值即可。