2015-06-19 55 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