![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=1738960624-w7Ud2lxjA0gCBy2vHmzHTqYFTMb4EUks-0-66da0c1211efc35a581ce52f46332455)
chinese.txt:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P99_12182.jpg?sign=1738960624-jRMpAorlpVm2xb6DnpJ83HwxiHk2EEaL-0-60283dcd0906728e73b5297ee2465bf6)
english.txt:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P99_12207.jpg?sign=1738960624-qQAzUVMRRn0Pyd0T8b8gGcaHHnCfGoLB-0-3774ead047494600e85f097d106f2af0)
期望输出结果如下:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P99_12233.jpg?sign=1738960624-PDwoUkmwcjxcNdILyjYT3ydCSfd8C4Zd-0-aedd9a1db283a8c516c3d487131dd578)
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=1738960624-82XeP1ZL1FYC0h3DtjKRYL7GzP821OIv-0-007098f3a0456de8819031e3a7f0f027)
图5-9 MapReduce求平均分执行流程
2. 程序源码
项目的新建及依赖jar包的引入见5.4节的数据去重案例,此处不再赘述。
本例完整的程序源代码如下:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P100_12419.jpg?sign=1738960624-d2DKbzN6nzuBACQ6yhFPk2bWptcIvDXv-0-48068300023e92e79a487da598f73258)
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P101_12712.jpg?sign=1738960624-RdrBCkF6CtrUthYTClwoOJYxplSx3xfA-0-748eb64f42f908d7ca820142298a2879)
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P102_12839.jpg?sign=1738960624-mXLRMFrHDjc7oMHwvG98h8xAenS6Wg8M-0-8c38b3e41d2fc830a2fd0b88ea07c9d4)
需要注意的是,Hadoop在涉及编码时默认使用的是UTF-8,如果文件编码格式是其他类型(如GBK),则会出现乱码。此时只需在map()或reduce()方法中读取Text时,进行一下转码,确保都是以UTF-8的编码方式在运行即可,转码的核心代码如下:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P102_12840.jpg?sign=1738960624-k3c63QWWpXTToCLlTg9xuvOz79ox6niP-0-e7ae2299e7d1b3cd2fd5e144fc43b616)
3. 程序运行
程序的打包和运行参考前面的“单词计数”和“数据去重”案例,此处不再赘述。
执行完成后,查看HDFS的/output目录生成的结果内容,如图5-10所示。
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P102_12797.jpg?sign=1738960624-rfbJjoA5QP4aqg9uSIYFftSxTheJTtJq-0-838bf338887c9574628df0764416f07e)
图5-10 查看HDFS结果内容