![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=1738972442-pJryHhhmWKhruDxbHfDunnHniz5GKqkC-0-567dcdbf30b34354e9d083c1368ac424)
chinese.txt:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P99_12182.jpg?sign=1738972442-RG4On0fHm0rmhpJduf0uBg5ZwcWtaEqU-0-a82f1f2c537d982383c7309da2a466b9)
english.txt:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P99_12207.jpg?sign=1738972442-GkEPo2PQoAtxecOl33XXDLxEW5sBSZBB-0-b9ee683495fc00dc9b16610eb4678c09)
期望输出结果如下:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P99_12233.jpg?sign=1738972442-hhRa0kNRiPAp4fZJcVgxZGpaxUGqt1Xi-0-582ea5b5704fc8d6ecc5e49418599989)
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=1738972442-3yCt6GvAIyFfqleugLWZFDxBLBMdF2h1-0-45b3a54ea078ef22690f17991a1d2f34)
图5-9 MapReduce求平均分执行流程
2. 程序源码
项目的新建及依赖jar包的引入见5.4节的数据去重案例,此处不再赘述。
本例完整的程序源代码如下:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P100_12419.jpg?sign=1738972442-uJkMdQf4dCAn1ziDKkFmowRg2VCOMh2D-0-6a21f9b80bd556f12a62e89eb41f151b)
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P101_12712.jpg?sign=1738972442-XjLOujYI4tXqj6CcesU8Rfnim6rZJoQd-0-8d39e3c8d3b6ba9987edde0f7b12cf79)
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P102_12839.jpg?sign=1738972442-z6wh6ANmqTqvXZyWB9acH0FEKFde3XRn-0-e788063cbe2b5289964014493c635cb8)
需要注意的是,Hadoop在涉及编码时默认使用的是UTF-8,如果文件编码格式是其他类型(如GBK),则会出现乱码。此时只需在map()或reduce()方法中读取Text时,进行一下转码,确保都是以UTF-8的编码方式在运行即可,转码的核心代码如下:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P102_12840.jpg?sign=1738972442-a6r2xPRmRmyirEpNsBYbkSsuAwAsQJj4-0-4fd3b856ee59ea89ec0a6cf12c3e8769)
3. 程序运行
程序的打包和运行参考前面的“单词计数”和“数据去重”案例,此处不再赘述。
执行完成后,查看HDFS的/output目录生成的结果内容,如图5-10所示。
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P102_12797.jpg?sign=1738972442-dDB1GFdN6frGIFyNO4KiexkUvkWh4pkB-0-de1f16b6033083361b56e75eacbfff67)
图5-10 查看HDFS结果内容