MR案例:计算学生成绩

news2024/11/15 19:53:12

计算学生成绩

  • 一、提出任务
  • 二、完成任务
    • (一)准备数据
      • 1、在虚拟机上创建文本文件
      • 2、上传文件到HDFS指定目录
    • (二)实现步骤
      • 1、创建Maven项目
      • 2、添加相关依赖
      • 3、创建日志属性文件
      • 4、创建成绩映射器类
      • 5、创建成绩驱动器类
      • 6、启动成绩驱动器类,查看结果
      • 7、创建成绩归并器类
      • 8、修改成绩驱动器类
      • 9、启动成绩驱动器列,查看结果

一、提出任务

成绩表,包含六个字段(姓名、语文、数学、英语、物理、化学),有五条记录
请添加图片描述
请添加图片描述

二、完成任务

(一)准备数据

  • 启动hadoop服务
    请添加图片描述

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

  • 创建calcscore目录,在里面创建score.txt文件
    请添加图片描述

注意:每列之间故意隔两个空格

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

  • 创建/calcscore/input目录,执行命令:hdfs dfs -mkdir -p /calcscore/input
    请添加图片描述

  • 将文本文件score.txt,上传到HDFS的/calcscore/input目录
    请添加图片描述

(二)实现步骤

1、创建Maven项目

  • Maven项目 - CalcScore
    请添加图片描述

  • 单击【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=ERROR, 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/calcscore.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

4、创建成绩映射器类

  • net.hw.mr里创建ScoreMapper
package net.hw.mr;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * 功能:成绩映射器类
 */
public class ScoreMapper extends Mapper <LongWritable, Text, Text, IntWritable>{
    @Override
    protected void map(LongWritable key, Text value, Context context) 
            throws IOException, InterruptedException {
        // 获取行内容
        String line = value.toString();
        // 按空格拆分得到字段数组
        String[] fields = line.split(" ");
        // 获取姓名
        String name = fields[0].trim();
        // 遍历各科成绩
        for (int i = 1; i < fields.length; i++) {
            // 获取成绩
            int score = Integer.parseInt(fields[i].trim());
            // 写入<姓名,成绩>键值对
            context.write(new Text(name), new IntWritable(score));
        }
    }
}

5、创建成绩驱动器类

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.IOUtils;
import org.apache.hadoop.io.IntWritable;
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.net.URI;

/**
 * 功能:成绩驱动器类
 */
public class ScoreDriver {
    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(ScoreDriver.class);

        // 设置Mapper类
        job.setMapperClass(ScoreMapper.class);
        // 设置map任务输出键类型
        job.setMapOutputKeyClass(Text.class);
        // 设置map任务输出值类型
        job.setMapOutputValueClass(IntWritable.class);

        // 定义uri字符串
        String uri = "hdfs://master:9000";
        // 创建输入目录
        Path inputPath = new Path(uri + "/calcscore/input");
        // 创建输出目录
        Path outputPath = new Path(uri + "/calcscore/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);
        }
    }
}

6、启动成绩驱动器类,查看结果

  • 运行ScoreDriver
    请添加图片描述

7、创建成绩归并器类

  • net.hw.mr包里创建ScoreReducer
    请添加图片描述
package net.hw.mr;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;
import java.text.DecimalFormat;

/**
 * 功能:成绩归并器类
 */
public class ScoreReducer extends Reducer<Text, IntWritable, Text, NullWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) 
            throws IOException, InterruptedException {
        // 声明变量
        int count = 0; // 科目数
        int sum = 0; // 总分
        double avg = 0; // 平均分
        // 遍历迭代器计算总分
        for (IntWritable value : values) {
            count++; // 科目数累加
            sum += value.get(); // 总分累加
        }
        // 计算平均分
        avg = sum * 1.0 / count;
        // 创建小数格式对象
        DecimalFormat df = new DecimalFormat("#.#");
        // 拼接每个学生总分与平均分成绩信息
        String scoreInfo = "(" + key + "," + sum + "," + df.format(avg) + ")";
        // 写入键值对
        context.write(new Text(scoreInfo), NullWritable.get());
    }
}

8、修改成绩驱动器类

  • 设置Reducer类及其输出键值类型
    请添加图片描述

9、启动成绩驱动器列,查看结果

  • 运行ScoreDriver 类
    请添加图片描述

  • 利用HDFS Shell命令查看结果文件内容

请添加图片描述

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

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

相关文章

adb常用命令(二)

adb:Android下面一个通用的调试工具管理设备或者手机模拟器的状态&#xff0c;进行手机操作:安装软件、卸载软件、系统升级、运行shell命令等adb命令&#xff1a;一、环境配置1&#xff0c;Java--JDK java -version2&#xff0c;SDK adb versionsdk版本管理&#xff08;SDK与…

Spark-RDD(转换算子、行动算子、序列化、依赖关系、持久化、分区器、文件读取和保存、累加器、广播变量)

文章目录RDDRDD特点核心属性执行原理RDD创建RDD并行度与分区内存数据的分区文件数据的并行度和分区RDD转换算子Value类型mapmapPartitionsmapPartitionsWithIndexflatMapglom(获取分区数组)groupByfilterdistinctcoalesce(缩小/扩大分区)repartition(扩大分区)sortBysample双 V…

人工智能 之 机器学习(Machine Learning)

目录 一&#xff1a;机器学习概述 二&#xff1a;机器学习算法 三&#xff1a;机器学习模型 四&#xff1a;机器学习过程 五&#xff1a;机器学习模型验证 六&#xff1a;sklearn模块 一&#xff1a;机器学习概述 程序化处理和机器学习处理&#xff1b; 主观思维和客观思…

python利用read()、readline()、readlines()读取文件

目录 1.语法和用法 2.实例 1.语法和用法 with open(file,moder,encodingNone) as f:#①读取所有文本data1 f.read()#②读取第一行数据data2 f.readline() #③读取所有文本数据 data3 f.readlines() 说明&#xff1a; with …… as ……&#xff1a;用于命名&#xff0c…

2022年总结:打开新世界,踏上新征程

一、前言 于我而言&#xff0c;2022年是我的幸运年&#xff0c;人生发生转折的关键点。同时&#xff0c;也可能是互联网行业、社会经济状况开始扭转的一年。因此&#xff0c;打算在CSDN开始记录下我的第一篇年总结。当然除了是意义特殊外&#xff0c;也还有现实实在的意义&…

【ROS服务通信】服务端和客户端

本文记录下ROS服务通信的实现&#xff0c;首先明确&#xff0c;ROS中的服务通信主要适用于偶然的&#xff0c;有实时要求的场景。服务通信基于客户-服务的架构&#xff0c;在主节点下&#xff0c;由服务端和客户端组成&#xff0c;服务端负责对请求做出响应&#xff0c;客户端发…

SQL Server2019详细安装教程(含JDBC连接)

文章目录一、安装SQL Server引擎1.1、安装SQL Server1.2、SQL Server选项配置二、SQL Server Management Studio&#xff08;SSMS&#xff0c;客户端&#xff09;2.1、安装连接工具2.2、连接SQL Server三、JDBC连接SQLServer提前配置查看SQLSever的启动端口Java代码参考文章一、…

雷神五代笔记本U盘重装系统图文教程

雷神五代笔记本U盘重装系统图文教程分享。有用户使用的雷神五代笔记本开机之后会自动安装很多的软件&#xff0c;导致卡到无法正常使用。这个情况是电脑中了病毒程序导致的&#xff0c;一起来看看如何通过U盘来重新安装系统操作教程吧。 准备工作&#xff1a; 1、U盘一个&#…

蓝桥杯嵌入式串口uart

文章目录前言一、板子串口原理图2.cubeMx配置3.波特率的简单讲解4.代码编写一、发送数据函数二、开启接收中断函数三、中断回调函数四、具体使用总结前言 本篇文章将带大家了解串口的编程&#xff0c;串口在比赛当中和实际工程中都是非常重要的&#xff0c;串口的难度也比较大…

微信小程序自定义tabbar底部菜单

自定义 tabBar 可以让开发者更加灵活地设置 tabBar 样式&#xff0c;以满足更多个性化的场景。 在自定义 tabBar 模式下&#xff0c;为了保证低版本兼容以及区分哪些页面是 tab 页&#xff0c;tabBar 的相关配置项需完整声明&#xff0c;但这些字段不会作用于自定义 tabBar 的渲…

UC伯克利提出AIGC图像编辑新利器InstructPix2Pix,AI模型P图更加精细

原文链接&#xff1a;https://www.techbeat.net/article-info?id4375 作者&#xff1a;seven_ 最近的一些工作向我们展示了AIGC在创造性生成图像、视频等方面的潜力&#xff0c;相信已有很多研究者在沿着这一方向进行拓展式的挖掘和创新。目前已有很多衍生应用出现在了大家眼前…

Java中的类和对象

文章目录1.面向对象和面向过程的含义2.类的定义与使用2.1什么是类2.2类的定义和格式2.3类名的修改方法![在这里插入图片描述](https://img-blog.csdnimg.cn/f126dbd47491402e93bc83bc07f51673.png)3.类和对象3.1类的实例化3.2成员的访问4.this引用4.1为何要this引用4.2什么是th…

java和vue的学生健康管理系统疫情打卡系统

需求&#xff1a;关注学生健康数据以及疫情打卡 系统分两个角色&#xff1a;学生和管理员 演示视频 https://www.bilibili.com/video/BV1iD4y1h74F/?share_sourcecopy_web&vd_sourceed0f04fbb713154db5cc611225d92156 技术&#xff1a;springbootvueelementuipagehelperm…

医疗器械实验室设计基本要求SICOLAB

医疗器械实验室设计基本要求SICOLAB 医疗器械实验室设计、医疗器械实验室装修、医疗器械实验室建设SICOLAB 一、实验室分类 &#xff08;一&#xff09;基础实验室 生物学评价检验实验室、电气安全检验实验室、环境试验检验实验室、手术医疗器械检验实验室、医用材料检验实…

【图像去噪】双立方插值和稀疏表示图像去噪【含Matlab源码 2009期】

⛄一、稀疏表示模型简介 图像的稀疏表示能够更好地表示出图像的特征, 其理论依据就是, 有用的图像信号是有序的, 而噪声普遍是杂乱无章的, 因此可以提取出能够表示图像特有奇异性特征的信息, 比如边缘、线段、条纹、端点等, 再用特定的过完备字典中的原子进行线性组合, 重构出…

JDK的安装及环境变量配置

一、应用安装 1、可以在官网下载jdk&#xff0c;&#xff08;http://www.oracle.com/&#xff09;下载自己适用的版本。 2、双击下载的 .exe安装包文件,如 jdk-8u131-windows-x64.exe。 3、进入安装向导。 4、点击下一步&#xff0c;更改安装路径&#xff0c;我选择安装在d盘…

30分钟看懂linux内核 - page介绍

【推荐阅读】 浅析linux内核网络协议栈--linux bridge 深入理解SR-IOV和IO虚拟化 了解Docker 依赖的linux内核技术 浅谈linux 内核网络 sk_buff 之克隆与复制 深入linux内核架构--进程&线程 内核中最初勾引我好奇心的还是内存管理方面&#xff0c;我们平时编写应用程…

代码随想录训练营第53天|LeetCode 1143.最长公共子序列、1035.不相交的线、53. 最大子序和

参考 代码随想录 题目一&#xff1a;LeetCode 1143.最长公共子序列 确定dp数组下标及其含义 dp[i][j]&#xff1a;字符串text1中的0&#xff5e;i字符构成的字符串和字符串text2中的0&#xff5e;j字符构成的字符串的最长 公共子序列 的长度为dp[i][j]。注意和之前做过的Leet…

将postgresql配置为Linux服务管理 systemctl service

发行版安装的数据库在装完后会自动添加数据库服务&#xff0c;但编译安装的不会&#xff0c;需要手动添加。 cd postgresql-14.0/contrib/start-scripts/ cp linux /etc/init.d/postgresql cd /etc/init.d/ vi postgresql 修改以下部分 ## EDIT FROM HERE# Installation pre…

Vuex4.0.0 源码解析

本文章基于以下版本撰写 VUE 版本&#xff1a; 3.0VUEX 版本&#xff1a;4.0.0Vuex仓库&#xff1a;https://github.com/vuejs/vuex/tree/v4.0.0Vux文档&#xff1a;https://vuex.vuejs.org/zh/ 在 vue 中使用 vuex import { createApp } from vue import { createStore } f…