Hadoop 詞頻統計(續)

2021-06-20 01:45:24 字數 1546 閱讀 9450

如上圖所示,統計結果僅僅是按照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個單詞字元。而合法的 單詞字元 為大小寫字母 數字和下劃線,其它字元均認為是單詞分隔符。輸入給出一段非空文字,最後以符號 ...