Hadoop大数据技术开发实战
上QQ阅读APP看书,第一时间看更新

5.5 案例分析:求平均分

本例通过对输入文件中的学生三科成绩进行计算,得出每个学生的平均成绩。输入文件中的每行内容均为一个学生的姓名和其相应的成绩,每门学科为一个文件。要求输出结果中每行有两个数据,其中第一个代表学生的姓名,第二个代表其平均成绩。

输入的三个文件内容如下:

math.txt:

chinese.txt:

english.txt:

期望输出结果如下:

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所示。

图5-9 MapReduce求平均分执行流程

2. 程序源码

项目的新建及依赖jar包的引入见5.4节的数据去重案例,此处不再赘述。

本例完整的程序源代码如下:

需要注意的是,Hadoop在涉及编码时默认使用的是UTF-8,如果文件编码格式是其他类型(如GBK),则会出现乱码。此时只需在map()或reduce()方法中读取Text时,进行一下转码,确保都是以UTF-8的编码方式在运行即可,转码的核心代码如下:

3. 程序运行

程序的打包和运行参考前面的“单词计数”和“数据去重”案例,此处不再赘述。

执行完成后,查看HDFS的/output目录生成的结果内容,如图5-10所示。

图5-10 查看HDFS结果内容