- Hadoop大数据技术开发实战
- 张伟洋
- 572字
- 2021-03-26 09:17:31
5.5 案例分析:求平均分
本例通过对输入文件中的学生三科成绩进行计算,得出每个学生的平均成绩。输入文件中的每行内容均为一个学生的姓名和其相应的成绩,每门学科为一个文件。要求输出结果中每行有两个数据,其中第一个代表学生的姓名,第二个代表其平均成绩。
输入的三个文件内容如下:
math.txt:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P99_12157.jpg?sign=1739356550-eCNEa7pB5vN6ZAi6EqMlyeYYNgq0kmpr-0-5d1b0f39931becfe691aeedb9712067b)
chinese.txt:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P99_12182.jpg?sign=1739356550-jQwt6NkMcHNH1AtYJqLoBPejVRSazOz0-0-a2f18a871b8f7fe1094ec9e6c57b7843)
english.txt:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P99_12207.jpg?sign=1739356550-cBXddAJl4I4RwrBHq1YB80W4O53Am3rB-0-f331301451dcb2e49a395660d0809522)
期望输出结果如下:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P99_12233.jpg?sign=1739356550-jlDV7gNXzeSYVogjfFNyxWARoqLaoNtr-0-72038716e00aa6139c9d126b485a9548)
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=1739356550-t5wBdB2XPMYqD3Pen4ann3DoyKKWYiwf-0-384da372176d25420ba767dbe5c09a87)
图5-9 MapReduce求平均分执行流程
2. 程序源码
项目的新建及依赖jar包的引入见5.4节的数据去重案例,此处不再赘述。
本例完整的程序源代码如下:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P100_12419.jpg?sign=1739356550-X7RckgnfbhAdGkwnhSNdsATZN33HV8XV-0-7b255f2abaf51fdd8ae5c53e65a87794)
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P101_12712.jpg?sign=1739356550-SGYfJYCzXHnzixA3fTR8TkU75vOuFB1L-0-14a487add181680cb35182abe18d6281)
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P102_12839.jpg?sign=1739356550-dKpSnMnF3HEKOZbdaH6iyMMk45m3ZD2w-0-04876655c55502ddc02a5d88cfcfb07d)
需要注意的是,Hadoop在涉及编码时默认使用的是UTF-8,如果文件编码格式是其他类型(如GBK),则会出现乱码。此时只需在map()或reduce()方法中读取Text时,进行一下转码,确保都是以UTF-8的编码方式在运行即可,转码的核心代码如下:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P102_12840.jpg?sign=1739356550-Iix3RW8yCCFpq6p8l3VemdO7XV2wqNls-0-eaa325780029a802f9a140e04a0a8c41)
3. 程序运行
程序的打包和运行参考前面的“单词计数”和“数据去重”案例,此处不再赘述。
执行完成后,查看HDFS的/output目录生成的结果内容,如图5-10所示。
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P102_12797.jpg?sign=1739356550-7926IsenC2RoC9mgUpcbmhT5ZhdvN9f4-0-ddef9fb537708b14ad7d3c0c19937824)
图5-10 查看HDFS结果内容