Map/Reduce 的文件效率挺高,尤其是碰到两个结构类似的文件,比如student.txt
和student-score.txt
,合起来学生成绩数据,刚好合适。你只需要把这两个文件传到 HDFS 上,写个 Map/Reduce 逻辑,先按学号做关联,再统计成绩,逻辑直白,代码也不复杂。用 Java 写,老规矩:Mapper 拆字段,Reducer 聚合信息,关键是要注意一下输入格式别写错了。
学生信息通常是学号+姓名
,成绩表是学号+课程+分数
,Map 那一层可以输出成key=学号
,value 就是分别带标签的两类信息,比如“info:张三”
和“score:数学:95”
这种。Reducer 那边再按学号分组,一遍循环就能把数据拼起来,输出的时候格式好看点,比如按课程列出每人平均分或者最高分,也不难。
如果你还不太熟 Map/Reduce 那套 API,可以看看这篇《Design and Implementation of a Student Performance Analysis System》,虽然是系统,但核心逻辑就是 Map/Reduce 学生数据,挺接近的,思路清晰。
哦对了,开发前记得用hdfs dfs -put
上传文件到 HDFS 目录,比如/input/student.txt
,Map/Reduce 任务就可以直接读取这些路径。运行完结果文件会在/output
里生成,命令行看下就行。
如果你有空,也可以用 MyBatis 或者 PL/SQL 做类似的学生信息,但要联表、写 SQL,没 Map/Reduce 直接,尤其大数据量时。对比一下,你就知道 MR 在这类批量文件时多方便。