MR实战:分科汇总求月考平均分

文章目录

  • 一、实战概述
  • 二、提出任务
  • 三、完成任务
    • (一)准备数据
      • 1、在虚拟机上创建文本文件
      • 2、上传文件到HDFS指定目录
    • (二)实现步骤
      • 1、创建Maven项目
      • 2、添加相关依赖
      • 3、创建日志属性文件
      • 4、创建学生实体类
      • 5、创建科目平均分映射器类
      • 6、创建科目平均分归并器类
      • 7、创建科目平均分驱动器类
      • 8、启动应用,查看结果

一、实战概述

  • 在本次实战中,我们将利用Hadoop MapReduce处理学生月考成绩数据,目标是计算每个同学语文、数学和英语的平均分。通过启动Hadoop服务、准备数据、创建Maven项目以及实现Mapper、Reducer和Driver类,我们将深入实践大数据处理流程。此任务将帮助我们理解MapReduce的工作原理,并提升大数据分析能力。一起来探索分布式计算的力量,揭示隐藏在海量数据中的学习表现趋势。

  • 我们首先启动Hadoop服务,并在虚拟机上创建包含语文、数学、英语成绩的文本文件chinese.txtmath.txtenglish.txt。然后,我们将这三个文件上传到HDFS的/subjectavg/input目录。

  • 接下来,我们通过Maven创建一个名为SubjectAvg的项目,并添加hadoopjunit依赖。在项目中,我们创建了日志属性文件log4j.properties以配置日志输出。

  • 为了处理数据,我们创建了学生实体类Student,该类实现了Writable接口,以便在Mapper和Reducer中使用。在Student类中,我们定义了姓名、语文、数学和英语成绩的属性以及相关的getter和setter方法。

  • 我们还创建了科目平均分映射器类SubjectAvgMapper,该类继承自Mapper<LongWritable, Text, Text, Student>。在map方法中,我们获取文件切片对象以确定读取的是哪个科目成绩文件,然后解析输入行并创建Student对象,根据科目设置相应的成绩。

  • 科目平均分归并器类SubjectAvgReducer继承自Reducer<Text, Student, Text, Student>。在reduce方法中,我们遍历学生迭代器,累加各科成绩,然后计算平均分并更新Student对象。

  • 最后,我们创建了科目平均分驱动器类SubjectAvgDriver,在其中设置了作业的相关配置,包括Mapper类、Reducer类、输入路径和输出路径。通过运行此驱动器类,我们可以得到每个同学各科的平均分。

二、提出任务

  • 语文月考成绩 - chinese.txt
1 张晓云 89
2 张晓云 73
3 张晓云 67
4 张晓云 70
5 张晓云 79
6 张晓云 87
7 张晓云 99
8 张晓云 83
9 张晓云 97
10 张晓云 92
11 张晓云 67
12 张晓云 86
1 王东林 49
2 王东林 83
3 王东林 67
4 王东林 49
5 王东林 93
6 王东林 87
7 王东林 65
8 王东林 92
9 王东林 60
10 王东林 94
11 王东林 81
12 王东林 90
1 李宏宇 77
2 李宏宇 66
3 李宏宇 89
4 李宏宇 87
5 李宏宇 96
6 李宏宇 79
7 李宏宇 87
8 李宏宇 96
9 李宏宇 69
10 李宏宇 87
11 李宏宇 96
12 李宏宇 79
  • 数学月考成绩 - math.txt
1 张晓云 79
2 张晓云 83
3 张晓云 77
4 张晓云 90
5 张晓云 89
6 张晓云 67
7 张晓云 89
8 张晓云 93
9 张晓云 90
10 张晓云 82
11 张晓云 77
12 张晓云 96
1 王东林 78
2 王东林 94
3 王东林 76
4 王东林 70
5 王东林 90
6 王东林 83
7 王东林 85
8 王东林 82
9 王东林 84
10 王东林 78
11 王东林 99
12 王东林 93
1 李宏宇 86
2 李宏宇 81
3 李宏宇 76
4 李宏宇 93
5 李宏宇 88
6 李宏宇 82
7 李宏宇 81
8 李宏宇 93
9 李宏宇 86
10 李宏宇 90
11 李宏宇 67
12 李宏宇 88
  • 英语月考成绩 - english.txt
1 张晓云 78
2 张晓云 83
3 张晓云 92
4 张晓云 66
5 张晓云 82
6 张晓云 89
7 张晓云 79
8 张晓云 68
9 张晓云 96
10 张晓云 91
11 张晓云 87
12 张晓云 82
1 王东林 69
2 王东林 86
3 王东林 73
4 王东林 99
5 王东林 67
6 王东林 95
7 王东林 74
8 王东林 92
9 王东林 76
10 王东林 88
11 王东林 92
12 王东林 56
1 李宏宇 88
2 李宏宇 78
3 李宏宇 92
4 李宏宇 78
5 李宏宇 89
6 李宏宇 76
7 李宏宇 92
8 李宏宇 75
9 李宏宇 88
10 李宏宇 92
11 李宏宇 97
12 李宏宇 85
  • 统计每个同学各科月考平均分
张晓云	Student{name='张晓云', chinese=82.4, math=84.3, english=82.8}
李宏宇	Student{name='李宏宇', chinese=84.0, math=84.2, english=85.8}
王东林	Student{name='王东林', chinese=75.8, math=84.3, english=80.6}

三、完成任务

(一)准备数据

  • 启动hadoop服务
    在这里插入图片描述

1、在虚拟机上创建文本文件

  • 创建subjectavg目录,在里面创建chinese.txt文件(数据没有显示全)
    在这里插入图片描述
  • 创建math.txt(数据没有显示全)
    在这里插入图片描述
  • 创建english.txt(数据没有显示全)
    在这里插入图片描述

2、上传文件到HDFS指定目录

  • 创建/subjectavg/input目录,执行命令:hdfs dfs -mkdir -p /subjectavg/input
    在这里插入图片描述
  • 将文本文件chinese.txtmath.txtenglish.txt,上传到HDFS的/subjectavg/input目录
    在这里插入图片描述

(二)实现步骤

1、创建Maven项目

  • Maven项目 - SubjectAvg
    在这里插入图片描述
  • 单击【Finish】按钮

2、添加相关依赖

  • pom.xml文件里添加hadoopjunit依赖
<dependencies>                                      <!--hadoop客户端-->                                <dependency>                                    <groupId>org.apache.hadoop</groupId>        <artifactId>hadoop-client</artifactId>      <version>3.3.4</version>                    </dependency>                                   <!--单元测试框架-->                                   <dependency>                                    <groupId>junit</groupId>                    <artifactId>junit</artifactId>              <version>4.13.2</version>                   </dependency>                                   
</dependencies>                                     

3、创建日志属性文件

  • resources目录里创建log4j.properties文件
    在这里插入图片描述
log4j.rootLogger=INFO, stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/subjectavg.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

4、创建学生实体类

  • net.hw.mr包里创建Student
    在这里插入图片描述
  • 注意:学生实体类必须实现Writable接口,才能作为Mapper和Reducer的输出值类型
package net.hw.mr;import org.apache.hadoop.io.Writable;import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;/*** 功能:学生实体类* 作者:华卫* 日期:2022年12月05日*/
public class Student implements Writable {private String name;private double chinese;private double math;private double english;public String getName() {return name;}public void setName(String name) {this.name = name;}public double getChinese() {return chinese;}public void setChinese(double chinese) {this.chinese = chinese;}public double getMath() {return math;}public void setMath(double math) {this.math = math;}public double getEnglish() {return english;}public void setEnglish(double english) {this.english = english;}public void write(DataOutput dataOutput) throws IOException {dataOutput.writeUTF(name);dataOutput.writeDouble(chinese);dataOutput.writeDouble(math);dataOutput.writeDouble(english);}public void readFields(DataInput dataInput) throws IOException {name = dataInput.readUTF();chinese = dataInput.readDouble();math = dataInput.readDouble();english = dataInput.readDouble();}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", chinese=" + chinese +", math=" + math +", english=" + english +'}';}
}

5、创建科目平均分映射器类

  • net.hw.mr包里创建SubjectAvgMapper
    在这里插入图片描述
  • 由于MR程序读取/subjectavg/input目录里的三个科目成绩文件,在Mapper获取文件切片时就要区分读取的是哪一个文件,可以通过contextgetInputSplit()方法获得文件切片对象,由此可以获取该切片对应的文件名,从而知道读取的是哪一科的成绩文件。
package net.hw.mr;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;import java.io.IOException;/*** 功能:科目平均分映射器类* 作者:华卫* 日期:2022年12月05日*/
public class SubjectAvgMapper extends Mapper<LongWritable, Text, Text, Student> {@Overrideprotected void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {// 获取文件切片对象(将输入切片强转成文件切片)FileSplit split = (FileSplit) context.getInputSplit();// 获取文件切片对应的文件名String filename = split.getPath().getName();// 拆分行获取成绩数据String line = value.toString();String[] data = line.split(" ");String name = data[1];int score = Integer.parseInt(data[2]);// 创建学生实体Student student = new Student();// 设置姓名属性student.setName(name);// 根据读取文件名来设置相应科目成绩if (filename.contains("chinese")) {student.setChinese(score);} else if (filename.contains("math")) {student.setMath(score);} else if (filename.contains("english")){student.setEnglish(score);}context.write(new Text(name), student);}
}

6、创建科目平均分归并器类

  • net.hw.mr包里创建SubjectAvgReducer
package net.hw.mr;import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;
import java.text.DecimalFormat;/*** 功能:科目平均分归并器类* 作者:华卫* 日期:2022年12月05日*/
public class SubjectAvgReducer extends Reducer<Text, Student, Text, Student> {@Overrideprotected void reduce(Text key, Iterable<Student> values, Context context) throws IOException, InterruptedException {// 创建学生对象Student student = new Student();// 设置姓名属性student.setName(key.toString());// 遍历学生迭代器,累加各科成绩for (Student value : values) {student.setChinese(student.getChinese() + value.getChinese());student.setMath(student.getMath() + value.getMath());student.setEnglish(student.getEnglish() + value.getEnglish());}// 求各科平均分DecimalFormat df = new DecimalFormat("##.#");student.setChinese(Double.parseDouble(df.format(student.getChinese() / 12)));student.setMath(Double.parseDouble(df.format(student.getMath() / 12)));student.setEnglish(Double.parseDouble(df.format(student.getEnglish() / 12)));// 输出处理后的键值对context.write(key, student);}
}

7、创建科目平均分驱动器类

  • net.hw.mr包里创建SubjectAvgDriver
    在这里插入图片描述
package net.hw.mr;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import java.net.URI;/*** 功能:成绩和驱动器类* 作者:华卫* 日期:2022年12月02日*/
public class ScoreSumDriver {public static void main(String[] args) throws Exception {// 创建配置对象Configuration conf = new Configuration();// 设置数据节点主机名属性conf.set("dfs.client.use.datanode.hostname", "true");// 获取作业实例Job job = Job.getInstance(conf);// 设置作业启动类job.setJarByClass(ScoreSumDriver.class);// 设置Mapper类job.setMapperClass(ScoreSumMapper.class);// 设置map任务输出键类型job.setMapOutputKeyClass(Text.class);// 设置map任务输出值类型job.setMapOutputValueClass(IntWritable.class);// 设置Reducer类job.setReducerClass(ScoreSumReducer.class);// 设置reduce任务输出键类型job.setOutputKeyClass(Text.class);// 设置reduce任务输出值类型job.setOutputValueClass(NullWritable.class);// 定义uri字符串String uri = "hdfs://master:9000";// 创建输入目录Path inputPath = new Path(uri + "/scoresum/input");// 创建输出目录Path outputPath = new Path(uri + "/scoresum/output");// 获取文件系统FileSystem fs =  FileSystem.get(new URI(uri), conf);// 删除输出目录(第二个参数设置是否递归)fs.delete(outputPath, true);// 给作业添加输入目录(允许多个)FileInputFormat.addInputPath(job, inputPath);// 给作业设置输出目录(只能一个)FileOutputFormat.setOutputPath(job, outputPath);// 等待作业完成job.waitForCompletion(true);// 输出统计结果System.out.println("======统计结果======");FileStatus[] fileStatuses = fs.listStatus(outputPath);for (int i = 1; i < fileStatuses.length; i++) {// 输出结果文件路径System.out.println(fileStatuses[i].getPath());// 获取文件系统数据字节输入流FSDataInputStream in = fs.open(fileStatuses[i].getPath());// 将结果文件显示在控制台IOUtils.copyBytes(in, System.out, 4096, false);}}
}

8、启动应用,查看结果

  • 运行SubjectAvgDriver
    在这里插入图片描述
    在这里插入图片描述

  • 下载结果文件 - part-r-00000
    在这里插入图片描述

  • 查看结果文件 - part-r-00000
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2662235.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

分享一个qml开发的Dialog

一、效果预览 二、源码分享 PopwindowWidget.qml import QtQuick import QtQuick.Controls import QtQuick.LayoutsApplicationWindow {id:selfwidth: 470height: 250visible: falsecolor: "#00000000"flags: Qt.Tool | Qt.FramelessWindowHint|Qt.MSWindowsFixedSiz…

阿里云数据库polardb怎么收费?

阿里云数据库PolarDB租用价格表&#xff0c;云数据库PolarDB MySQL版2核4GB&#xff08;通用&#xff09;、2个节点、60 GB存储空间55元5天&#xff0c;云数据库 PolarDB 分布式版标准版2核16G&#xff08;通用&#xff09;57.6元3天&#xff0c;阿里云百科aliyunbaike.com分享…

PPT可以转换成电子画册吗

答案是当然可以&#xff0c;PPT是可以转换成电子画册的。电子画册具有3D仿真翻页的效果&#xff0c;而且还可以很好地保存图片和文字信息&#xff0c;并方便在各种设备上查看。 要将PPT转换成电子画册&#xff0c;只需要一个工具就能轻松转换。给大家推荐这款转换工具&#xff…

Linux开发工具——gdb篇

Linux下调试工具——gdb 文章目录 makefile自动化构建工具 gdb背景 gdb的使用 常用命令 总结 前言&#xff1a; 编写代码我们使用vim&#xff0c;编译代码我们使用gcc/g&#xff0c;但是我们&#xff0c;不能保证代码没问题&#xff0c;所以调试是必不可少的。与gcc/vim一样&…

华为发布《智能世界2030》思维导图笔记

华为发布《智能世界2030》思维导图笔记

【VTK-Rendering::Annotation】第一期 vtkCaptionActor2D

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ&#xff1a;870202403 前言 本文分享vtkCaptionActor2D源码解析&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会继续努力分享&#xff0c;一起进步&#xff01; 你的点赞就是我…

【Redis交响乐】Redis中的通用命令

文章目录 1. 基本命令 get set2. 全局命令(1)keys(2)exists(3)del(4)expire && ttl面试题: redis中key的过期策略是怎么实现的?定时器的实现原理(1)基于优先级队列/堆(2)基于时间轮实现的定时器 (5) type 我们知道,redis是按照键值对的方式存储数据的. Redis中基本的命…

tcp/ip实现两个手机之间连接同步显示

app主界面 选择一&#xff1a;TCP客户端 选择二&#xff1a;TCP服务端 点击下图item时进入曲线绘制页面 如果是服务器端它不需要连任何设备就可以直接进入绘制界面如果是TCP的话就不能直接进入&#xff0c;否则就会提示未连接网络连接不能放在主线程&#xff0c;页面去调方法&…

外贸自建站教程指南?海洋建站的方法技巧?

最新的外贸自建站教程&#xff1f;做电商如何搭建外贸独立站&#xff1f; 在如今竞争激烈的国际贸易市场&#xff0c;外贸企业想要脱颖而出&#xff0c;拥有一个专业、高效的网站至关重要。海洋建站将为您提供一份全面的外贸自建站教程指南&#xff0c;帮助您迈出建设成功网站…

亚信安慧AntDB数据库两项目分别入选2023“星河”标杆、优秀案例

近日&#xff0c;由中国信息通信研究院、中国通信标准化协会大数据技术标准推进委员会&#xff08;CCSA TC601&#xff09;共同组织的第七届大数据“星河&#xff08;Galaxy&#xff09;”案例评选结果公示&#xff0c;亚信安慧AntDB数据库两项目入选&#xff0c;其中“基于Ant…

PowerShell Instal 一键部署TeamCity

前言 TeamCity 是一个通用的 CI/CD 软件平台,可实现灵活的工作流程、协作和开发实践。允许在您的 DevOps 流程中成功实现持续集成、持续交付和持续部署。 系统支持 Centos7,8,9/Redhat7,8,9及复刻系列系统支持 Windows 10,11,2012,2016,2019,2022高版本建议使用9系列系统…

Gooxi亮相2023中国数据与存储峰会展示最新存储解决方案

今日&#xff0c;以“数智创新&#xff0c;AI未来”为主题的2023 中国数据与存储峰会在北京顺利举行&#xff0c;Gooxi受邀参与并展示了最新存储服务器产品&#xff0c;搭配最新处理器平台&#xff0c;能够广泛应用在人工智能、数据分析、云端计算、数据存储和高性能计算等领域…

浪潮信息:打造IT领域首个数字样机应用,荣膺鼎革奖

10月26日&#xff0c;第六届“鼎革奖”数字化转型先锋榜正式揭晓&#xff0c;51个企业及机构荣登榜单&#xff0c;浪潮信息的“全栈数智化研发”项目获得“研发转型典范奖”。这一荣誉再次彰显了浪潮信息在数字化转型领域的领先地位&#xff0c;展现了其在研发转型方面的卓越成…

rax3000m刷openwrt固件

rax3000m刷机过程&#xff08;nand版本&#xff09; 刷机准备文件https://www.123pan.com/s/X5m9-6Ynj.html提取码:VtBW 接线关系&#xff1a;路由器lan口接电脑 1.上传配置开启ssh的配置文件&#xff08;登录路由器后台管理界面在找到配置管理&#xff0c;上传配置文件rax3…

价格成谜,小米汽车到底要卖给谁?

文&#xff5c;刘俊宏 编&#xff5c;王一粟 “不要再讲9.9万了&#xff0c;不可能的&#xff0c;也不要再讲14.9万&#xff0c;小米SU7是有理由的贵”&#xff0c;小米集团创始人、董事长雷军在12月28日的小米汽车技术发布会上&#xff0c;把价格作为最大的悬念留给了市场。…

C++:第十一讲DFS深搜

Everyday English Your optimal career is simply this: Share the real you with physical world through th e process of creative self-expression. 你的最佳职业很简单&#xff0c;就是这样&#xff1a;通过创造性自我表达的途径和世界分享真实的你。 前言 今天带着大家…

软件测试/测试开发丨Python、pycharm 安装与环境配置

Python 安装与环境配置 1. Python 安装 版本推荐 3.10.0下载地址&#xff1a;www.python.org/downloads/w… 若需要安装旧版本&#xff0c;在页面下方选择对应版本即可&#xff0c;MacOS选择对应系统即可 图示下载windows 3.11.4版本 安装Python 执行安装程序&#xff0c;安…

CRM诞生到现在历经了哪些发展阶段?CRM系统的五个关键节点

CRM管理系统从被发明到现在&#xff0c;历经多次迭代已经成为一个相对成熟的系统。企业可以靠它管理客户信息&#xff0c;提升盈利能力。今天就来介绍一下CRM的发展历程。 一、CRM系统的雏形 广义上的CRM系统其实可以追溯到古希腊时期。当时的商人靠书写记录自己与客户和合作…

稳定币分析的 3 个关键指标

作者&#xff1a;lesleyfootprint.network 数据源&#xff1a;The Stablecoin Dashboard 稳定币因其固有特性而在加密货币领域中独树一帜&#xff0c;它们的特点是价格与特定的参考资产&#xff08;通常是美元或欧元等法定货币&#xff09;锚定。这种锚定机制的目的是缓解数字…

Oracle 拼接字符串

语法 使用||拼接如果内容中有单引号&#xff0c;则可在该单引号前面再加一个单引号进行转义 例子 比如有一个业务是根据需要生成多条插入语句 select insert into des_account_des_role(des_account_id, roles_id) values( || id || , || (select id from des_role where wo…