1 数据源(学生成绩.csv)
💥 旧坑勿踩:可以复制下面数据,粘贴到txt里把文件拓展格式改为csv,在上传至Hadoop平台之前一定要确保文件的编码方式为utf-8(否则中文会乱码),具体操作为使用记事本打开学生成绩.csv文件,看右下角的编码方式,如果不是utf-8则可以将文件另存为时修改其编码方式。
💥一定一定一定不要为了元数据的好看就在第一行为数据加字段名,看是好看了,到时候运行不出来结果就很难受,不要问我怎么知道的,一个下午的血淋淋的教训。
英语,李沐,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
2 hadoop平台上传数据源
Hadoop平台上传数据,其实也可以理解为向HDFS里存储数据,前提是Hadoop的集群必须搭建好,这里就默认大家都已经搭建完成并可以正常运行。这里可以如下图双击hadoop下的sbin目录下的start-all.cmd启动集群。
集群启动成功后,在源数据的存储路径下打开DOS窗口,可以在该目录的文件路径框下输入cmd打开,或者直接在桌面打开DOS窗口再cd进源数据的存储路径。按照下图使用命令创建目录并将源数据(学生成绩.csv)上传至hadoop平台
3 idea代码
3.1 工程框架
新建一个maven工程,建立如下工程框架 :
3.2 导入依赖
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>
3.3 系统主入口(menu)
//这里的导包是完成跨package调用其它包里的类 import couerse_info.CiMain; import course_score_same.CssMain; import max_min_avg.MmaMain; import sex_number_name.SnnMain; import student_info.SiMain; import sum_avg_sort.SasMain; import java.lang.reflect.Method; import java.util.Scanner; public class menu { public static void main(String[] args) { try { Scanner scanner = new Scanner(System.in); while(true){ System.out.println("=========基于MapReduce的学生成绩分析========="); System.out.println("1、计算每门成绩的最高分、最低分、平均分"); System.out.println("2、计算每个学生的总分及平均成绩并进行排序"); System.out.println("3、统计所有学生的信息"); System.out.println("4、统计每门课程中相同分数分布情况"); System.out.println("5、统计各性别的人数及他们的姓名"); System.out.println("6、统计每门课程信息"); System.out.println("7、退出"); System.out.print("请输入你想要选择的功能:"); int option = scanner.nextInt(); Method method = null; switch(option){ case 1: method = MmaMain.class.getMethod("main", String[].class); method.invoke(null, (Object) new String[] {}); break; case 2: method = SasMain.class.getMethod("main", String[].class); method.invoke(null, (Object) new String[] {}); break; case 3: method = SiMain.class.getMethod("main", String[].class); method.invoke(null, (Object) new String[] {}); break; case 4: method = CssMain.class.getMethod("main", String[].class); method.invoke(null, (Object) new String[] {}); break; case 5: method = SnnMain.class.getMethod("main", String[].class); method.invoke(null, (Object) new String[] {}); break; case 6: method = CiMain.class.getMethod("main", String[].class); method.invoke(null, (Object) new String[] {}); break; case 7: System.exit(1); break; default: System.out.println("输入正确的功能按键!!"); break; } } } catch (Exception e) { e.printStackTrace(); } } }