目录

1 编程前总分析

1.1 数据源

1.2 需要掌握的知识

1.2.1 Hadoop对比java的数据类型

1.2.2 MapReduce流程简介

1.3.3 MapReduce流程细分

2 编码阶段

2.1 导入依赖

2.2 mapper

2.3 reducer

2.4 main


1 编程前总分析

1.1 数据源

英语,李沐,85,男,20
数学,李沐,54,男,20
音乐,李沐,54,男,20
体育,李沐,34,男,20
语文,李媛,81,女,20
音乐,李媛,85,女,20
体育,李媛,89,女,20
语文,马珂,75,女,19
英语,马珂,85,女,19
音乐,马珂,75,女,19
体育,马珂,65,女,19
语文,潘琴,42,女,20
英语,潘琴,48,女,20
音乐,潘琴,48,女,20
体育,潘琴,78,女,20
英语,秦灿,75,男,19
数学,秦灿,89,男,19
音乐,秦灿,85,男,19
体育,秦灿,99,男,19
语文,王靓,85,女,21
英语,王靓,85,女,21
数学,王靓,48,女,21
音乐,王靓,86,女,21
音乐,王靓,85,女,21
体育,王靓,96,女,21
体育,王靓,87,女,21
英语,吴起,85,男,20
数学,吴起,85,男,20
英语,张翔,96,男,20
数学,张翔,85,男,20
音乐,张翔,85,男,20
体育,张翔,87,男,20
语文,郑虎,85,男,20
数学,郑虎,85,男,20
音乐,郑虎,88,男,20
体育,郑虎,68,男,20
语文,周伟,76,男,19
英语,周伟,85,男,19
数学,周伟,76,男,19
音乐,周伟,99,男,19
体育,周伟,90,男,19
数学,朱鸿,90,男,21
音乐,朱鸿,80,男,21
体育,朱鸿,81,男,21

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)

<dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.7.3</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>2.7.3</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.7.3</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-mapreduce-client-core</artifactId><version>2.7.3</version></dependency>
</dependencies>

2.2 mapper

package course_score_same;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;/*
stu[0]:课程名称
stu[1]:学生姓名
stu[2]:成绩
stu[3]:性别
stu[4]:年龄
该功能实现:统计该课程中成绩相同的学生姓名*/
//Mapper的泛型依次为输入文本的第几行,该行的文本,Mapper的输出key,Mapper的输出value
public class CssMapper extends Mapper<LongWritable, Text,Text,Text> {
//重写方法:在idea的代码区使用快捷键 alt+insert选择鼠标单击override methods选择map方法@Override//map方法的三个参数,前两个就是输入文本行号,该行的文本,最后一个Context context固定写法protected void map(LongWritable key, Text value,Context context) throws IOException, InterruptedException {//将文件的每一行传递过来,使用split分割后利用字符数组进行接收String[] stu = value.toString().split(",");//拼接字符串:课程和成绩String sc = stu[0]+"\t"+stu[2];//向Reducer传递参数-> Key:课程+成绩 Value:学生名context.write(new Text(sc),new Text(stu[1]));}
}

2.3 reducer

package course_score_same;import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;//Reducer的泛型依次为Mapper输出的key作为Reducer的输入,Mapper输出的value作为Reducer的输入,Reducer的输出key,Reducer的输出value
public class CssReducer extends Reducer <Text,Text,Text,Text>{
//重写方法与Mapper一样@Override//reduce方法的三个参数:Mapper输出的key作为Reducer的输入,Mapper输出的value作为Reducer的输入,最后一个Context context固定写法protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {//创建StringBuffer用来接收该课程中成绩相同的学生的姓名StringBuffer sb = new StringBuffer();//num变量用来计数int num = 0;//遍历values参数,将所有的value拼接进sb,并统计学生数量for(Text value:values){sb.append(value.toString()).append(",");num++;}//如果num=1,则表明该课程的这个成绩只有一个学生,否则就输出if(num>1){String names = "一共有" + num + "名学生,他们的名字是:" +sb.toString();System.out.println("*************************************************");System.out.println(key.toString() + names);context.write(key,new Text(names));}}
}

2.4 main

package course_score_same;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;public class CssMain {public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException, URISyntaxException {//创建job和“统计相同课程相同分数的人数”任务入口Configuration conf = new Configuration();Job job = Job.getInstance(conf);job.setJarByClass(CssMain.class);//设置Mapper和Reducer的入口job.setMapperClass(CssMapper.class);job.setReducerClass(CssReducer.class);//设置Mapper的输入输出类型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(Text.class);//设置Reducer的输入输出类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(Text.class);//指定输入输出路径String inputPath = "hdfs://localhost:9000/mapreduce/input/学生成绩.csv";String outputPath = "hdfs://localhost:9000/mapreduce/output/该课程中成绩相同的学生姓名.txt";FileInputFormat.setInputPaths(job,new Path(inputPath));FileOutputFormat.setOutputPath(job,new Path(outputPath));//输出路径存在的话就删除,不然就只能手动删除,否则会报该文件已存在的异常FileSystem fileSystem = FileSystem.get(new URI(outputPath), conf);if (fileSystem.exists(new Path(outputPath))) {fileSystem.delete(new Path(outputPath), true);}//执行jobjob.waitForCompletion(true);}
}

至此,一个完整的MapReduce的编写就已经完全结束了,如果想要别的功能,只需要修改mapper和reducer类中重写方法的方法体本身,还有main方法里面的各项参数值即可。

为了进一步锻炼大家MapReduce确定mapper输出的key和value,下面再找两个例子练习一下(每个人的想法都不一样,所以说并没有标准的答案,合理即可):

  • 统计所有学生的信息—>(key:姓名+性别+年龄;value:课程+成绩)
  • 计算每门成绩的最高分、最低分、平均分—>(key:课程名称;value:成绩)
  • 统计各性别的人数及他们的姓名—>(key:性别;value:姓名)

【手把手 脑把脑】教会你使用idea基于MapReduce的统计数据分析(从问题分析到代码编写)相关推荐

  1. 利用机器学习分析脑电数据(原理分析+示例代码+快速上手)

    由于本人对于脑机接口以及脑电技术的极度爱好(其实目的是:是把U盘插到大脑里,然后就不用学习了哈哈哈哈),近几月看了较多这方面的内容,变打算写下博客总结分析一下. 目录 一.  机器学习分析简介 二.机 ...

  2. 生物学-脑:脑(动物中枢神经系统主要部分)

    ylbtech-生物学-脑:脑(动物中枢神经系统主要部分) 脑(英:brain,拉:encephalon)是中枢神经系统的主要部分,位于颅腔内.低等脊椎动物的脑较简单.人和哺乳动物的脑特别发达.脑包括 ...

  3. python数据预测代码_手把手教你用Python玩转时序数据,从采样、预测到聚类丨代码...

    原标题:手把手教你用Python玩转时序数据,从采样.预测到聚类丨代码 原作 Arnaud Zinflou 郭一璞 编译 时序数据,也就是时间序列的数据. 像股票价格.每日天气.体重变化这一类,都是时 ...

  4. 脑分享 | 脑结构、脑工作原理最详细图解

    来源:深度学习进阶学习社 摘要:这个帖子很好地提醒了小编我,为什么愿意跟如此美丽可爱的大脑一起工作. 因为真正的大脑非常不可爱,长得也难看. 但是,过去一个月,我一直生活在充斥着红色血管的 Googl ...

  5. HAPPE+ER:一款让脑电研究人员“更快乐”的软件,可用于事件相关电位(ERP)分析的标准化预处理管道

    导读 事件相关电位(ERP)设计是用脑电图(EEG)检测神经认知功能的常用方法.然而,传统的ERP数据预处理方法是手动编辑,这是一个主观且耗时的过程.最近创建了许多自动化通道,以满足EEG数据预处理的 ...

  6. 《神经科学:探索脑》脑结构

    三个初级脑泡:前脑forebrain.中脑midbrain.后脑或菱脑hindbrain. 前脑的分化:2个次级脑泡从前脑的两侧长出,分别为视泡和端脑泡.余下的不成对结构部分为 间脑diencepha ...

  7. 从零开始,手把手教会你5分钟用SPARK对PM2.5数据进行分析(包括环境准备和SPARK代码)...

    2019独角兽企业重金招聘Python工程师标准>>> 要从零开始,五分钟做完一个基于SPARK的PM2.5分析项目,你是不是会问 1. PM2.5的数据在哪里? 2. SPARK的 ...

  8. python alphago_手把手:AlphaGo有啥了不起,我也能教你做一个(附Python代码)

    大数据文摘作品 编译:叶一.Chloe.彭湘伟.钱天培 在2016年3月,Deepmind研发的AlphaGo以4:1的成绩,击败了曾荣获18次世界冠军的围棋选手,李世石(Lee Sedol).超过2 ...

  9. python contains类似函数_五步教会你用python爬虫神器PyQuery!(内含详细步骤和代码)...

    前言: 今天为大家带来的内容,是五步教会你用python爬虫神器PyQuery!(内含详细步骤和代码),在这里还是要啰嗦下,为了有更好的观赏性,大部分代码用图片的方式呈现出来!喜欢的话不忘点赞关注不迷 ...

最新文章

  1. R语言ggplot2可视化:通过水平半小提琴图(Horizontal Half Violin Plots)和抖动数据点( jittered data)可视化雨云图(Rain Cloud plots)
  2. 南大计算机学硕复试,2019南大CS考研复试笔试回忆
  3. Oracle WebLogic 最新补丁的绕过漏洞分析 cve-2020-2883
  4. 历届试题 买不到的数目
  5. mysql memory_MySQL MEMORY 引擎及性能比对
  6. python局部变量想作用于全局_python 局部和全局作用域
  7. cannot write file to virtual machine aborting the file copy operation.
  8. ORA-01658:无法为表空间XXX中的段创建initial区
  9. c#重写了窗体的OnKeyDown事件,但是不执行
  10. java怎么判断一个char是汉字_JAVA中判断char是否是中文的几种方法
  11. leetcode - 1201. 丑数 III
  12. 51nod 1836:战忽局的手段
  13. bind_param 类怎么写_情感类自媒体怎么写?你不知道的情感类文章4大禁忌!
  14. ORA-17129=SQL 字符串不是DML 语句
  15. 用c语言写财务软件,财务软件,您选对了吗?T+/T+C、T3深度实测对比
  16. 学习笔记 Tianmao 篇 OkHttp 网络的使用
  17. photoshop 快捷键_PhotoShop快捷键一览
  18. 惠普m180n故障码04_惠普m180n打印机驱动(解决m180n打印机连接问题)V1.0 免费版
  19. 软件测试的系统代码,软件测试工程师管理系统代码
  20. python_飞机大战_main_py_一

热门文章

  1. c语言100000阶乘,求10000的阶乘(c语言代码实现)
  2. php如何封装数组,PHP数组转对象 对象转数组封装类
  3. 光子计算机玩游戏,用于光计算的光子计算机
  4. python文本特征选择,机器学习--特征选择(Python实现)
  5. 摆胯教学分解_聚十年求索,筑理想课堂——厦门市梧侣学校十周年庆区级教学小学数学(数与形)...
  6. python操作json字符串,超详细的Python文件操作知识
  7. 17 软件源_9成职场人支持“准点下班”,2020年度职场报告:工作是最大焦虑源
  8. iphone储存空间系统怎么清理_教你快速清理 iPhone 系统缓存垃圾,拒绝卡顿!
  9. java报错空指针异常_java – 空指针异常错误,没有明显的代码错误
  10. mysql无序id怎么优化limit_MYSQL分页limit速度太慢优化方法