我想了解mrjob更好mrjob:示例如何自動知道如何在文本文件中查找行?
from mrjob.job import MRJob
class MRWordFrequencyCount(MRJob):
def mapper(self, _, line):
yield "chars", len(line)
yield "words", len(line.split())
yield "lines", 1
def reducer(self, key, values):
yield key, sum(values)
if __name__ == '__main__':
MRWordFrequencyCount.run()
我通過
$ python word_count.py my_file.txt
運行的例子,它按預期工作,但我不明白它是如何自動知道它會讀取一個文本文件並按每行分割。我不確定_
會做什麼。
據我所知,mapper()
爲每一行生成三個鍵/值對是否正確?如果我想處理文件夾中的每個文件,該怎麼辦?
而且reducer()
自動知道如何將每個鍵的值加起來?
如果我想通過map reduce運行單元測試,那麼mapper和reducer會是什麼樣子?它甚至有必要嗎?
所以如果有人解析JSON文件,它應該看起來像'{ '鍵1': 'VALUE1'} { 'KEY2': '值'}'這裏爲txt文件只是有'值1 \ n值2 \ n值3 \ n'? – KJW
使用mrjob實現,鍵和值都可以是JSON對象。實際上,我認爲它是通過JSONProtocol在內部傳遞的。並且鍵值對在序列化時由製表符分隔。因此,對於JSON協議,例如,一行看起來像''鍵'\ t {「somelist」:[1,2,3]} \ n'。這實際上就是爲什麼你的輸出,鍵是雙引號的原因,因爲它在JSON中以字符串形式輸出。對於初始輸入,如果使用JSONValueProtocol,那麼您希望輸入文件看起來像「{」L1「:1} \ n {」L2「:2} \ n {」L3「:3}'等等。每行只包含該協議的值。 –
我其實建議你閱讀關於輸入協議的mrjob文檔。這是非常重要且有用的,但如果您不熟悉如何在內部處理輸入/輸出/鍵值,可能會引起混淆。 –