![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=1739383152-vyGzj27BYpUXfJFS490HaK2I6IRBJRmX-0-e532d44303c9b9f165e015cc7e25b4ed)
chinese.txt:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P99_12182.jpg?sign=1739383152-YkxfC44sBVAUpxSC5w4mwq129tr6t2C7-0-6f830dabcbe09d58e8bb1b1b0573c82d)
english.txt:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P99_12207.jpg?sign=1739383152-p29npNnzFeMXb8HKeKmMVcDiTscYCZ69-0-ee7c9a7b4703c5afbb1dec3b119795dc)
期望输出结果如下:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P99_12233.jpg?sign=1739383152-b6t5w3YFK9bZs2ev58qrFcoeRbxMO470-0-16406a0cee21ef37d14c23b63d854417)
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=1739383152-uFd7Sv39rmKTYiQ7MrOidC7qVJuSpR77-0-447afee688ead2e5df834925a3514fed)
图5-9 MapReduce求平均分执行流程
2. 程序源码
项目的新建及依赖jar包的引入见5.4节的数据去重案例,此处不再赘述。
本例完整的程序源代码如下:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P100_12419.jpg?sign=1739383152-pCQBmjTrNRDqS2hIQnOthMz4AOSKcCxF-0-5c25377f59dda59a69b7d98b54ed7064)
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P101_12712.jpg?sign=1739383152-XgEda25UKtz8qP6AP2PSTTX6kWLsKgTm-0-567903f33c958a3b32e0a7216761a953)
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P102_12839.jpg?sign=1739383152-ayDzeYumkqmdhJzL9fA3LoozUMlWfSTl-0-7259e2ee068147b9eb6ec56e00b89e2b)
需要注意的是,Hadoop在涉及编码时默认使用的是UTF-8,如果文件编码格式是其他类型(如GBK),则会出现乱码。此时只需在map()或reduce()方法中读取Text时,进行一下转码,确保都是以UTF-8的编码方式在运行即可,转码的核心代码如下:
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P102_12840.jpg?sign=1739383152-lIqZXG5keRR3w1PAAoxKyAcCzg9jbvfF-0-4eba639a69b1046dc2f4075d40d56a27)
3. 程序运行
程序的打包和运行参考前面的“单词计数”和“数据去重”案例,此处不再赘述。
执行完成后,查看HDFS的/output目录生成的结果内容,如图5-10所示。
![](https://epubservercos.yuewen.com/B7D09D/15825993105224906/epubprivate/OEBPS/Images/Figure-P102_12797.jpg?sign=1739383152-ovec95NKLp1xtU0abez8QMIhR7MZh7kt-0-b0db0b165306368a8183406df2416c6f)
图5-10 查看HDFS结果内容