大数据处理从零开始————9.MapReduce编程实践之信息过滤之学生成绩统计demo

news2024/11/29 10:58:35

1.项目目标

1.1 需求概述

        现在我们要统计某学校学生的成绩信息,筛选出成绩在60分及以上的学生。

1.2 业务分析

        如果我们想实现该需求,可以通过编写一个MapReduce程序,来处理包含学生信息的文本文件,每行包含【学生的姓名,科目,分数】,以逗号分隔,要求如下:

        分别编写一个Student类和一个Mapper类;

        Student 类包含以下字段:姓名(String)、科目(String)、分数(int);

        需要自定义 Student 对象的序列化和反序列化方法,以便Hadoop能够正确处理它;

        Mapper类将输入文本数据解析为 Student 对象,并且只输出成绩大于60分的学生;

        以固定字符串"学生信息"为Key,Student对象为Value,作为该Mapper的输出。

2. 新建项目

        如果没有进行配置项目,则需要先进行配置,可以参考下文的前半部分:

大数据处理从零开始————8.基于Java构建WordCount项目-CSDN博客

        如果配置好就可以直接进行下一步。新建项目后,确定好项目的名称,组ID,工作ID的信息。

        打开pom.xml文件,添加项目配置,添加如下配置。

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <!--<scope>test</scope>-->
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>3.3.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>3.3.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>3.3.3</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
    </dependencies>
pom.xml文件

        如果pom.xml全部标红可以看上一节解决方法,完全相同。

3.完善项目代码

       3.1 创建Student类

import org.apache.hadoop.io.Writable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

public class Student implements Writable {
    private String name;
    private String subject;
    private int score;

    public Student() {
    }

    public Student(String name, String subject, int score) {
        this.name = name;
        this.subject = subject;
        this.score = score;
    }

    public void write(DataOutput out) throws IOException {
        out.writeUTF(name);
        out.writeUTF(subject);
        out.writeInt(score);
    }

    public void readFields(DataInput in) throws IOException {
        name = in.readUTF();
        subject = in.readUTF();
        score = in.readInt();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "姓名:" + name + ", 科目:" + subject + ", 分数:" + score;
    }
}

        在这里可能由很多人不明白,我们来解释一下这段代码的关键点:

        首先它实现了Writable接口,Writable接口主要实现了序列化和反序列化。Writable接口定义了两个方法。1. void write(DataOutput out):主要用于将对象的字段写入数据输入流DataOutput中;在实现此方法时,需要按照某种顺序依次写入对象的所有属性,确保与readFields方法对应。2.void readfields(DataInput in):该方法用于从数据输入流 DataInput 中读取对象的字段;按照与 write 方法相同的顺序读取,确保数据能正确映射回对象的属性。

        其次重写了toString方法。

构建Student类

        

        3.2 实现Mapper类

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;

public class StudentMapper extends Mapper<LongWritable, Text, Text, Student> {
    private static final Text outputKey = new Text("学生信息");

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        // 解析每行文本
        String line = value.toString();
        String[] fields = line.split(",");

        // 创建Student对象
        if (fields.length == 3) {
            String name = fields[0].trim();
            String subject = fields[1].trim();
            int score = Integer.parseInt(fields[2].trim());

            // 只输出成绩大于60分的学生
            if (score > 60) {
                Student student = new Student(name, subject, score);
                context.write(outputKey, student);
            }
        }
    }
}

       首先通过泛型确保了输入形式是key——value的形式。

        然后创建了一个名为 outputKey 的常量,它代表输出的键,值为 "学生信息"。这个常量在整个类中是共享的,避免了在每次调用 map 方法时重复创建。

        接着实现了map方法,在map方法中先将输入值逐行改成字符串数组形式;然后检查字段数组是否为三,确保数组行格式正确,接着分别提取姓名、科目和分数,并进行适当的修剪以去除多余的空格,进一步使用 Integer.parseInt() 方法将分数字符串转换为整数;最后输出大于60分的人。

构造Mapper类

        3.3 构建驱动器StudentDriver类

        在构建完map类后,程序并不能直接运行,因此我们还要构建一个Driver类来驱动程序。Driver类是一个 Hadoop MapReduce 程序的驱动程序,负责设置作业的配置并启动 MapReduce 任务。

import org.apache.hadoop.conf.Configuration; // 导入 Hadoop 配置类  
import org.apache.hadoop.fs.Path; // 导入路径类,用于文件路径处理  
import org.apache.hadoop.io.Text; // 导入 Text 类,表示字符串形式的键  
import org.apache.hadoop.mapreduce.Job; // 导入 Job 类,用于定义一个 MapReduce 作业  
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; // 导入输入格式类  
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; // 导入输出格式类  

public class StudentDriver {  
    public static void main(String[] args) throws Exception {  
        // 检查命令行参数数量,要求输入两个参数  
        if (args.length != 2) {  
            System.err.println("Usage: StudentDriver <input path> <output path>");  
            System.exit(-1); // 如果参数数量不对,打印用法并退出  
        }  

        // 创建 Hadoop 配置对象  
        Configuration conf = new Configuration();  
        // 创建一个新的 Job 实例,作业名称为 "Student Info Filter"  
        Job job = Job.getInstance(conf, "Student Info Filter");  

        // 设置程序的 Jar 文件位置  
        job.setJarByClass(StudentDriver.class);  
        // 设置使用的 Mapper 类  
        job.setMapperClass(StudentMapper.class);  

        // 设置 Mapper 的输出键值类型  
        job.setMapOutputKeyClass(Text.class); // 输出键的类型为 Text  
        job.setMapOutputValueClass(Student.class); // 输出值的类型为 Student(自定义类型)  

        // 设置最终输出的键值类型  
        job.setOutputKeyClass(Text.class); // 输出键的类型为 Text  
        job.setOutputValueClass(Student.class); // 输出值的类型为 Student  

        // 设置输入和输出路径  
        FileInputFormat.addInputPath(job, new Path(args[0])); // 设置输入路径  
        FileOutputFormat.setOutputPath(job, new Path(args[1])); // 设置输出路径  

        // 提交作业,并根据完成情况退出  
        System.exit(job.waitForCompletion(true) ? 0 : 1);  
    }  
}

        详细解释看代码注释。

构造StudentDriver类

4.运行程序

        首先给程序打包。

打包

        然后给程序重命名。

重命名

        接着上传到hadoop中。        

上传

        启动hadoop,并将程序上传到hadoop中。

./myhadoop.sh start 启动hadoop
cd /user/local/data     #转到文件夹下
ll    #查看是否上传成功
vim student #创立测试文件
hdfs dfs -put student /cs  #将student上传到/cs中

        注意:我这里有cs,如果没有的话,应该先用下面命令创建/cs

        hdfs dfs mkdir /cs  #在hadoop下创建一个cs文件。

上传hdfs

        运行jar包:hadoop jar map.jar com.jyd.StudentDriver /cs /ssoutput

运行包

查看结果: hdfs dfs -cat /ssoutput/part-r-00000

结果

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

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

相关文章

《深度学习》【项目】OpenCV 答题卡识别 项目流程详解

目录 一、上半部分 1、定义展示图像函数 2、预处理 运行结果&#xff1a; 3、轮廓检测并绘制 运行结果&#xff1a; 4、排序轮廓 5、定义排序点函数 6、透视变换 1&#xff09;定义透视变换处理函数 2&#xff09;执行透视变换 运行结果&#xff1a; 7、二值化处理…

python 边际分布图

import seaborn as snspenguins sns.load_dataset("penguins") colors {"Gentoo": #AE5259, "Adelie": #CF992C, "Chinstrap": #6B9DAA}# 分类散点图 sns.jointplot(datapenguins, x"bill_length_mm", y"bill_depth_…

Linux的kafka安装部署

1.kafka是一个分布式的,去中心化的,高吞吐低延迟,订阅模式的消息队列系统 确保要有jdk与zookeeper安装配置 2.下载kafka安装包 http://archive.apache.org/dist/kafka/2.4.1/kafka_2.12-2.4.1.tgz 此时可以wget http://archive.apache.org/dist/kafka/2.4.1/kafka_2.12-2.4.…

数字后端零基础入门系列 | Innovus零基础LAB学习Day1

一 Floorplan 数字IC后端设计如何从零基础快速入门&#xff1f;(内附数字IC后端学习视频&#xff09; Lab5-1这个lab学习目标很明确——启动Innovus工具并完成设计的导入。 在进入lab之前&#xff0c;我们需要进入我们的FPR工作目录。 其中ic062为个人服务器账户。比如你端…

Graph Contrastive Learningwith Reinforcement Augmentation

IJCAI24 推荐指数&#xff1a; #paper/⭐⭐⭐ 领域&#xff1a;图增强强化学习 胡言乱语&#xff1a; 不愧是清华组的论文&#xff0c;这个实验的目的是利用强化学习去生成对比学习的增强视图。但是&#xff0c;其仍然有一些小问题&#xff1a;其本质实际是对以往的图增强方法…

vrrp实验

配置Trunk和Access [SW3]int e0/0/1 [SW3-Ethernet0/0/1]p l a [SW3-Ethernet0/0/1]p d v 10 [SW3-Ethernet0/0/1]int e0/0/2 [SW3-Ethernet0/0/2]p l a [SW3-Ethernet0/0/2]p d v 10 [SW3-Ethernet0/0/2]int e0/0/3 [SW3-Ethernet0/0/3]p l a [SW3-Ethernet0/0/3]p d v 20 [S…

postgresql 安装

一、下载 PostgreSQL: File Browser 下载地址 PostgreSQL: File Browser 上传到服务器,并解压 二、安装依赖 yum install -y perl-ExtUtils-Embed readline-devel zlib-devel pam-devel libxml2-devel libxslt-devel openldap-devel 创建postgresql 和目录 useradd …

位运算 -- 力扣

1486. 数组异或操作 1486. 数组异或操作 根据题意&#xff0c;使用参数 n 和 start 生成一个数组&#xff0c;最后返回数组中所有元素按位异或&#xff08;XOR&#xff09;后得到的结果。 首先&#xff0c;异或运算的规则是&#xff0c;当同一位的二进制数不同时结果为 1&…

【Golang】Go 语言中的 time 包详解:全面掌握时间处理与应用

在 Go 语言中&#xff0c;time 包提供了强大的时间处理功能&#xff0c;适用于各种场景&#xff1a;获取当前时间、格式化和解析时间、计算时间间隔、设置定时器、处理超时等。在开发过程中&#xff0c;熟练掌握 time 包能够帮助我们轻松处理时间相关的操作&#xff0c;尤其是定…

小程序之获取用户头像与昵称

html 这个是通过一个点击事件进行显示的,下面是效果图,获取头像最关键的是 open-type"chooseAvatar" ,获取昵称最关键的是 type"nickname" ,大家多加注意i哦 <!-- 大的输入调取 --><view class"myis_box" wx:if"{{showMyisBox}}…

做ppt用什么软件好?5个办公必备的ppt工具推荐!

ppt用什么软件做&#xff1f; 相信很多人看到这个&#xff0c;会第一时间想到Microsoft Office套件包含的幻灯片软件Powerpoint&#xff0c;它的名声甚广&#xff0c;以至于某种程度上成了PPT的代名词。 在Powerpoint之外&#xff0c;这些年也陆续诞生了各式各样的PPT软件&am…

CocosCreator 快速部署 TON 游戏:Web2 游戏如何使用 Ton支付

在本篇文章中&#xff0c;我们将继续探讨如何使用 Cocos Creator 开发 Telegram 游戏&#xff0c;重点介绍如何集成 TON 支付功能。通过这一教程&#xff0c;开发者将学会如何在游戏中接入 TON Connect&#xff0c;实现钱包连接、支付以及支付后的校验流程&#xff0c;最终为 W…

YOLO11改进|SPPF篇|引入SPPFCSPC金字塔结构

目录 一、【SPPFCSPC】金字塔结构1.1【SPPFCSPC】金字塔结构介绍1.2【SPPFCSPC】核心代码 二、添加【SPPFCSPC】金字塔结构2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【SPPFCSPC】金字塔结构 1.1【SPPFCSPC】金字塔结构介绍 下图是…

vue后台管理系统从0到1(1)

文章目录 vue后台管理系统从0到1&#xff08;1&#xff09;nvm 下载安装1.卸载nodejs环境2.安装nvm 安装nrm vue后台管理系统从0到1&#xff08;1&#xff09; 第一节主要是先安装我们的工具nvm nodejs版本管理工具&#xff0c;和nrm镜像管理工具 nvm 下载安装 nvm是一款管理…

网络流量预测的学习——持续更新ing

文章目录 前情提要何为网络流量网络流量分析&#xff08;NTA&#xff09;网络流量组成网络流量处理过程 预测网络流量的工具wiresharkbrim&#xff08;zui&#xff09; 机器学习中的网络流量预测参考文章 前情提要 记录一些有关网络流量的学习 何为网络流量 网络流量是指在计…

【D3.js in Action 3 精译_033】4.1.0 DIY 实战:如何通过学习 d3.autoType 函数深度参与 D3 生态建设

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

又被特斯拉演了?继续“画饼式”发布Robotaxi,产业链静观其变

9月底的暴涨后&#xff0c;A股资产正经历回调&#xff0c;科技板块变现参差。不过&#xff0c;无人驾驶领域的预期依然很强。 10月10日科技股全线调整之际&#xff0c;无人驾驶板块盘中的巨幅震荡拉升就是典型的预热动作。东箭科技、天龙股份等多只智能驾驶个股涨停。核心驱动…

ACR、PZ、AMC仪表接线说明及通讯协议解析

1.ACR/PZ/AMC多功能表接线说明 三相三线接线说明 使用场合负载是平衡系统&#xff0c;并且没有零线的场合。 1. 端子号1&#xff0c;2为辅助电源&#xff1a; 如上图&#xff0c;接入相电压220V输入。其中辅助电源的火线加装5A保险丝&#xff0c;零线直接接到零排上。 2&am…

iPhone使用指南:如何在没有备份的情况下从 iPhone 恢复已删除的照片

本指南将向您展示如何在没有备份的情况下从 iPhone 恢复已删除的照片。我们所有人在生活中的某个时刻都一定做过一些愚蠢的事情&#xff0c;例如从手机或电脑中删除一些重要的东西。这是很自然的&#xff0c;没有什么可羞耻的。您可能在辛苦工作一天后回来。当突然想看一些照片…

C++开发五子棋游戏案例详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…