如上圖所示,統計結果僅僅是按照key排序,value值沒有順序。而我們最終希望的是:
1) 統計結果在乙個最終檔案中,而不是分散到很多檔案中。
2) 統計結果按value值,及單詞出現的頻率排序。
應該有很多方法可以實現以上的要求,我們以比較簡單的方式來完成這個需求。我們將充分利用hadoop的shuffle功能。
本質問題是,map傳遞給reduce的鍵值對是由hadoop排過序的,而reduce的輸出結果本身不會進行排序。雖然我們看到的每乙個reduce的輸出結果是按key排序的,但是這種有序結果不是reduce處理而來的,而是因為傳遞給reduce的輸入是有序的。(可參考hadoop的shuffle功能介紹)。
回到主題,如果我們能將上圖的統計結果的key和value互換,變成以下形式:
346 about
10 above
4 adage
16 adapt
6 adept
2 admit
42 adult
然後經由map處理(及時map什麼都不做),則map後的輸出將會按照key排序,變成如下形式:
2 admit
4 adage
6 adept
10 above
16 adapt
42 adult
346 about
這個不正是我們所需要的嗎? 正是!
但是此時另乙個問題將會出現,有可能多個單詞出現的頻率一樣,比如 is 和 are均出現100此,則map的輸入檔案中將會有:
is 100
are 100
而map處理後的輸出中將只會有are而沒有is:
100 are
道理很簡單,key值是唯一的。
此時我們可以將key和value組合成乙個新的復合key,比如:
0000100is is
0000100are are
新的key值包含詞頻資料和單詞本身,這樣我們就能保證map的輸入中的每乙個鍵值對都可以得到保留。而且,map的輸出檔案按照新的key排序後,本身詞頻也變成有序的了。
下一步就要交給reduce來處理了,reduce重新將鍵值對翻轉,但是在處理reduce的value,即詞頻數值時,需要從輸入的key中做擷取。(我們可以採用前補零的方式將詞頻數值統一處理成10位長度,外加單詞本身作為key)。
最終結果如下圖:
如果你通過hadoop提交作業,輸入的命令列如下:
其中file:///home/user/desktop/downloads是資料檔案的存放路徑
後兩個引數分別為作業1和作業2的輸出檔案位址。
注:我們採用了兩個作業來處理這個需求。
Hadoop之詞頻統計WordCount
參考文章 ubuntu16.04安裝hadoop單機和偽分布式環境超詳細 1.啟動hdfs start all.sh2.檢視hdfs下包含的檔案目錄 hadoop dfs ls 由於是第一次執行,沒有檔案 3.在hdfs中建立乙個檔案目錄input,將 usr local hadoop readme...
05 測試hadoop自帶詞頻統計demo
在了解了hadoop中的儲存元件hdfs之後,我們再來看一下hadoop中另乙個重要元件的計算mapreduce。hdfs搞定海量的儲存,mapreduce搞定海量的計算。hadoop如其他優秀的開源元件一樣,也提供了豐富的demo,下面我們就來看一下如何使用mapreduce自帶demo進行詞頻統...
PTA 詞頻統計
請編寫程式,對一段英文文字,統計其中所有不同單詞的個數,以及詞頻最大的前10 的單詞。所謂 單詞 是指由不超過80個單詞字元組成的連續字串,但長度超過15的單詞將只擷取保留前15個單詞字元。而合法的 單詞字元 為大小寫字母 數字和下劃線,其它字元均認為是單詞分隔符。輸入給出一段非空文字,最後以符號 ...