2014-03-03 40 views
0

我正在嘗試使用Python中的mrjob框架編寫MapReduce程序來計算Trigrams。到目前爲止,這是我所:MapReduce:如何跟蹤映射器中多行的狀態(比如說計數trigrams)?

from mrjob.job import MRJob 

class MRTrigram(MRJob): 

    def mapper(self, _, line): 
     w = line.split() 
     for idx,word in enumerate(w): 
      if idx < len(w) - 2: 
       # Generate a trigram using the current word and next 2 words 
       trigram = w[idx] + " " + w[idx + 1] + " " + w[idx + 2] 
       yield trigram, 1 

    def reducer(self, key, values): 
     yield sum(values), key 

# ignore this part - its just standard bolierplate for mrjob! 
if __name__ == '__main__': 
    MRTrigram.run() 

如可以看出,我還沒有處理,其中一個卦是分裂成多個行(比方說,「這是」在3線的末端的情況下,在第4行開頭的「最好的時間」 - 但是我的代碼不會捕獲trigram「在這種情況下它是」!)。

如何在多個映射調用中保留狀態,確保無論映射器是否由底層運行時分配作業,只有連續線條上的卦被計數?我想將每行的最後2個單詞存儲在MRTrigram類中的一個持久數據結構中,但後來我意識到我無法保證我是否在線i和i + 1之間比較單詞(而不是線i,j,其中j可以在文檔中的任何位置行!)。

任何想法讓我在正確的軌道上?

+0

真的,沒有人在星期一對MWE和明確的查詢提出問題嗎?也許它不像我想的那麼簡單! :) – TCSGrad

+0

我也對此感興趣。網上的每個實現似乎都忽略了這個問題,下面的答案是沒有用的。 –

回答

0

您可能會對writing a custom protocol有所瞭解,但我相信mrjob會在添加自定義行爲(即形成關鍵字和值)之前採用由新行字符分隔的流輸入,因此它可能無法使用mrjob。

如果您使用的是Hadoop(即本機Java),那麼您可以編寫自定義輸入格式,該格式採用多行文本並從中解析出鍵值對。