官术网_书友最值得收藏!

5.5 案例分析:求平均分

本例通過對輸入文件中的學生三科成績進行計算,得出每個學生的平均成績。輸入文件中的每行內容均為一個學生的姓名和其相應的成績,每門學科為一個文件。要求輸出結果中每行有兩個數據,其中第一個代表學生的姓名,第二個代表其平均成績。

輸入的三個文件內容如下:

math.txt:

chinese.txt:

english.txt:

期望輸出結果如下:

1. 設計思路

根據MapReduce的工作原理可知,Map任務最終處理的結果對<key,value>會送到Reduce任務進行合并,具有相同key的<key,value>對則會送到同一個 Reduce任務中進行處理,即Reduce任務處理的數據是key和這個key對應的所有value的一個集合(value-list)。

MapReduce經典的WordCount(單詞計數)例子是將接收到的每一個value-list進行求和,進而得到所需的結果。而本例中,我們將Reduce任務接收到的value-list進行求平均分后,作為輸出的value值即可,輸出的key值仍然為接收到的key。

整個求平均分的流程如圖5-9所示。

圖5-9 MapReduce求平均分執行流程

2. 程序源碼

項目的新建及依賴jar包的引入見5.4節的數據去重案例,此處不再贅述。

本例完整的程序源代碼如下:

需要注意的是,Hadoop在涉及編碼時默認使用的是UTF-8,如果文件編碼格式是其他類型(如GBK),則會出現亂碼。此時只需在map()或reduce()方法中讀取Text時,進行一下轉碼,確保都是以UTF-8的編碼方式在運行即可,轉碼的核心代碼如下:

3. 程序運行

程序的打包和運行參考前面的“單詞計數”和“數據去重”案例,此處不再贅述。

執行完成后,查看HDFS的/output目錄生成的結果內容,如圖5-10所示。

圖5-10 查看HDFS結果內容

主站蜘蛛池模板: 金溪县| 淮安市| 白玉县| 通城县| 新化县| 华坪县| 辰溪县| 积石山| 天柱县| 仁怀市| 新余市| 东莞市| 隆昌县| 离岛区| 墨江| 容城县| 特克斯县| 寻乌县| 金华市| 樟树市| 永顺县| 南开区| 易门县| 道真| 日喀则市| 铜陵市| 子洲县| 自治县| 南投市| 白山市| 绥江县| 衡东县| 泾源县| 皋兰县| 内黄县| 南阳市| 黑山县| 河间市| 肥城市| 略阳县| 秭归县|