使用idea基于MapReduce的统计数据分析(从问题分析到代码编写)
目录
1 编程前总分析
1.1 数据源
1.2 需要掌握的知识
1.2.1 Hadoop对比java的数据类型
java | Hadoop |
boolean | BooleanWritable |
Integer/int | IntWritable |
Long/long | LongWritable |
Float/float | FloatWritable |
Double/double | DoubleWritable |
String | Text |
NullWritable |
1.2.2 MapReduce流程简介
MapReduce是一种简化的并行计算编程模型框架,主要解决了分布式计算的相关问题。所谓的分布式计算就是将一个文件里的数据内容,一行行的发送给mapper,mapper接收到一行数据使用split分割后接收,并按key分组后传给reducer,reducer将接收到的一组数据进行处理后输出,当所有的组都处理完成结束一个MapReduce。
1.3.3 MapReduce流程细分
功能:统计每门课程中相同分数的人有多少及他们的名字
思考一下,想要统计每门课程中相同分数的人数及名字,我们需要以什么字段为标准对数据进行分组(mapper最主要的功能就是分组)?想要搞明白上面的问题,试着和mysql的分组查询操作做一下类比,具体sql语句如下:
SELECT 姓名 FROM 表 GROUP BY 课程名称,成绩 ;
参考sql语句的分组查询,mapper功能就相当于按课程和成绩两个字段值对数据进行分组并查询学生姓名。mapper里的最后一句context.write(key,value);里的两个参数,key等于GROUP BY后面的字段名-->课程成绩和成绩的拼接字符串,value等于GROUP BY前面的字段名-->姓名。mapper就实现了将所有key值相同的分为一组,value放在迭代器中,一组组传给reducer,reducer使用一个Text类型的key和迭代器value进行接收。
2 编码阶段
mapreduce拆分:每个mapreduce程序都可以拆分成三个小部分mapper类、reducer类、main方法类。每个类都有其固定的框架,需要改变的就只有mapper和reducer类中重写方法的方法体本身,还有main方法里面的各项参数值。
如果说,当然我的读者肯定都是聪明的亚批,我是说如果你朋友的java编程基础不是很好,我的注释表示它完全可以很细。
2.1 导入依赖
MapReduce不需导入的四个依赖(hadoop-client、hadoop-hdfs、hadoop-common、hadoop-mapreduce-client-core)
2.2 mapper
2.3 reducer
2.4 main
至此,一个完整的MapReduce的编写就已经完全结束了,如果想要别的功能,只需要修改mapper和reducer类中重写方法的方法体本身,还有main方法里面的各项参数值即可。
为了进一步锻炼大家MapReduce确定mapper输出的key和value,下面再找两个例子练习一下(每个人的想法都不一样,所以说并没有标准的答案,合理即可):
- 统计所有学生的信息—>(key:姓名+性别+年龄;value:课程+成绩)
- 计算每门成绩的最高分、最低分、平均分—>(key:课程名称;value:成绩)
- 统计各性别的人数及他们的姓名—>(key:性别;value:姓名)
- 点赞
- 收藏
- 关注作者
评论(0)