![Hadoop大数据技术开发实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/392/27563392/b_27563392.jpg)
5.5 案例分析:求平均分
本例通过对输入文件中的学生三科成绩进行计算,得出每个学生的平均成绩。输入文件中的每行内容均为一个学生的姓名和其相应的成绩,每门学科为一个文件。要求输出结果中每行有两个数据,其中第一个代表学生的姓名,第二个代表其平均成绩。
输入的三个文件内容如下:
math.txt:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P99_12157.jpg?sign=1738965974-4pOyabWifvIa9eWEIStOp3Kx92dkP7Rx-0-12af7efa55ab8b3754fdacbe679ab528)
chinese.txt:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P99_12182.jpg?sign=1738965974-Zlb9SdqBqShGOFq88IEeMAgmmYHdLYWH-0-e9e7327fd4cd8914086c9e4d447fb5d7)
english.txt:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P99_12207.jpg?sign=1738965974-ZAcYCTHOcnIoBUmbjfdjsJdkxUCMsPlS-0-f129466441d92991e084c836fe5232c2)
期望输出结果如下:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P99_12233.jpg?sign=1738965974-TI4mg4MD6Fb7WlesMY92RnCTGzi0hE4M-0-a1454c87742bec90d2c9576ce714ef23)
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所示。
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P100_12266.jpg?sign=1738965974-WSAsaUXO5PpnlNXiSW7encsDaceilpq7-0-b67d33f6b979ad370d22e5e479508494)
图5-9 MapReduce求平均分执行流程
2. 程序源码
项目的新建及依赖jar包的引入见5.4节的数据去重案例,此处不再赘述。
本例完整的程序源代码如下:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P100_12419.jpg?sign=1738965974-10h5WnMwDRQsmhPpM18UoU4AEzYthsRv-0-32e1272330fadf2a25497f72a7c58a92)
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P101_12712.jpg?sign=1738965974-eQsDBqMbsWwYI6A3IXzqZIhihxTxxxWM-0-00937d19dd1290cd87f50ded966c3e9d)
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P102_12839.jpg?sign=1738965974-b5uMWZJSGtjhrfqZCElgjKvwQURm6NZ6-0-a46928e8d5d721da27b3530f672a2caa)
需要注意的是,Hadoop在涉及编码时默认使用的是UTF-8,如果文件编码格式是其他类型(如GBK),则会出现乱码。此时只需在map()或reduce()方法中读取Text时,进行一下转码,确保都是以UTF-8的编码方式在运行即可,转码的核心代码如下:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P102_12840.jpg?sign=1738965974-SaQEUgqYC7rt0RHKXxNxkbOpHlpDZUIS-0-01bdb1955f54f4f41573e22d5fff13ba)
3. 程序运行
程序的打包和运行参考前面的“单词计数”和“数据去重”案例,此处不再赘述。
执行完成后,查看HDFS的/output目录生成的结果内容,如图5-10所示。
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P102_12797.jpg?sign=1738965974-iKDLHmNZ3iyNd5mOoqLeX4q93tUDWzvD-0-543e4c04b3a256bffafa99898af4ce48)
图5-10 查看HDFS结果内容