2015-06-19 33 views
0

进出口套牢在mrjob mareduce框架一个简单的问题:我想在一个给定的parragraph字的平均数,我得到这个:如何获得mrjob中文本的平均单词数?

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) 

有了这个代码,我得到后减少的过程中,总在线条与文字的话,但我不知道怎么做,以获得平均:

words/TotalOfLines 

我在这个模型编程的新手,如果任何人都可以说明这个例子会非常赞赏。

在此期间,非常感谢您的关注和参与

回答

1

毕竟,答案很简单:我实际上发现减速器的许多数值等于行数。所以,在减速器中,我只需要计算键的数值。

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) 

所以映射器为每个线发送的一对( “单词”,x)时,将导致一个元组洗牌过程:( “字”:X1,X2,X3,... xnumberOfLines)whic是减速器的输入,然后我只需要计算键的数值,那就是它,我得到了线的数量。

希望对某人有帮助。

0

在你减速机,你已经输出了密钥,SUM(值)到输出文件。您只需将输出文件读入Java/Scala程序并计算平均值即可。

+0

谢谢你的回答@Cheng,我以后再说。我会把答案放在 – Dade

+0

以下我认为如果你有多个减速器,你的答案会产生问题...... –

+0

好吧,你是对的。但是,在这种情况下,我正在进行地图缩减的基本练习。我知道,在未来,我将使用hadoop框架,包含多个映射器和缩减器,以及组合器和更高级的过程,但目前,我们的目标是了解映射缩减逻辑。 Ty为你的意愿。 – Dade