MapReduce之MR处理:按课程排学生名词以及最高最低平均分数

2023-05-16

根据此篇文章可以熟练使用Reduce阶段进行分组,并且了解jdk8新特性代码。

我们开看下原始数据

某地方编辑的txt文件数据不是太大:

English,liudehua,80
English,lijing,79
English,nezha,85
English,jinzha,60
English,muzha,71
English,houzi,99
English,libai,88
English,hanxin,66
English,zhugeliang,95
Math,liudehua,74
Math,lijing,72
Math,nezha,95
Math,jinzha,61
Math,muzha,37
Math,houzi,37
Math,libai,84
Math,hanxin,89
Math,zhugeliang,93
Computer,liudehua,54
Computer,lijing,73
Computer,nezha,86
Computer,jinzha,96
Computer,muzha,76
Computer,houzi,92
Computer,libai,73
Computer,hanxin,82
Computer,zhugeliang,100

一、MR之学生成绩,最高,最低,平均分数。

    1.Mapper阶段代码

package com.studentExam.avgscore;

/**
 * $功能描述: AvgscoreMapper
 *
 * @author :smart-dxw
 * @version : 2019/6/19 21:58 v1.0
 */

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 AvgMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        // 部曲
        String line = value.toString();
        String[] s = line.split(",");
        // 这里k根据姓名区分
        context.write(new Text(s[1]), new IntWritable(Integer.parseInt(s[2])));
    }
}

    2.Reducer阶段代码

package com.studentExam.avgscore;

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

import java.io.IOException;
import java.util.ArrayList;
import java.util.IntSummaryStatistics;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * $功能描述: AvgReducer
 *
 * @author :smart-dxw
 * @version : 2019/6/19 22:01 v1.0
 */
public class AvgReducer extends Reducer<Text, IntWritable, Text, Text> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> value, Context context) throws IOException, InterruptedException {
        // 接收 成绩
        List<Integer> scores = new ArrayList<Integer>();
        // reduce阶段获取成绩
        Iterator<IntWritable> it = value.iterator();
        while (it.hasNext()) {
            scores.add(it.next().get());
        }

        // 获取集合的元素数量 总和 最小 平均 最大
//      IntSummaryStatistics{count=3, sum=237, min=66, average=79.000000, max=89}
        IntSummaryStatistics score = scores.stream().collect(Collectors.summarizingInt(Integer::intValue));
        // 输出 Math.round() 方法返回一个最接近的 int、long 型值,四舍五入。
        context.write(key, new Text(score.getMax() + "\t" + score.getMin() + "\t" + Math.round(score.getAverage())));
    }
}

3.Job类这里job类定义了一个公共的驱动类

package com.studentExam.avgscore;

import com.Drive;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;

import java.io.IOException;
import java.net.URISyntaxException;

/**
 * $功能描述: run
 *
 * @author :smart-dxw
 * @version : 2019/6/19 22:02 v1.0
 */
public class AvgRun {
    public static void main(String[] args) throws ClassNotFoundException, URISyntaxException, InterruptedException, IOException {
        args = new String[]{
                "C:\\studentExam\\01\\in",
                "C:\\studentExam\\01\\AvgRun"
        };
        Drive.run(AvgRun.class,
                AvgMapper.class,
                Text.class,
                IntWritable.class,
                AvgReducer.class,
                Text.class,
                Text.class,
                args[0],
                args[1]);
    }
}

结果

hanxin	89	66	79
houzi	99	37	76
jinzha	96	60	72
libai	88	73	82
lijing	79	72	75
liudehua	80	54	69
muzha	76	37	61
nezha	95	85	89
zhugeliang	100	93	96

 

二、根据课程得出高、中、低的学生以及人数。

数据材料还是上边的第一个原始数据:

    1.Mapper阶段代码

package com.studentExam.classscore;

/**
 * $功能描述: AvgscoreMapper
 *
 * @author :smart-dxw
 * @version : 2019/6/19 21:58 v1.0
 */

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

import java.io.IOException;

public class AvgClassMapper extends Mapper<LongWritable, Text, Text, Text> {

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String line = value.toString();
        String[] s = line.split(",");
        // 去重班级 拼接 姓名与成绩在reduce阶段进行过滤
        context.write(new Text(s[0]), new Text(s[1] + "," + s[2]));
    }
}

    2.Reduce阶段代码

package com.studentExam.classscore;

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

import java.io.IOException;
import java.util.Iterator;

/**
 * $功能描述: AvgReducer
 *
 * @author :smart-dxw
 * @version : 2019/6/19 22:01 v1.0
 */
public class AvgClassReducer extends Reducer<Text, Text, Text, Text> {

    Text k = new Text();
    Text v = new Text();

    @Override
    protected void reduce(Text key, Iterable<Text> value, Context context) throws IOException, InterruptedException {
        // 高 中 低 学生
        String hStr = "";
        String mStr = "";
        String lgStr = "";

        // reduce阶段获取学生
        Iterator<Text> text = value.iterator();
        while (text.hasNext()) {
            String[] split = text.next().toString().split(",");
            int score = Integer.parseInt(split[1]);
            // 高级(90及以上)中级(80到89)低级(0到79)
            if (score >= 90) {
                hStr += ", " + split[0];
            } else if (score >= 80 && score <= 89) {
                mStr += ", " + split[0];
            } else if (score <= 70) {
                lStr += ", " + split[0];
            }
        }
        // 过滤掉 ", "
        hStr = hStr.substring(2);
        mStr = mStr.substring(2);
        lStr = lStr.substring(2);
        // 封装key
        k.set("课程" + key.toString() + ":\n");
        // 封装value 这里split切分因为拼接是 ", "所以切分应该是", "因为结果展示是", "相对应格式化结果
        String s = "高:\t" + hStr + "\t总人数:" + hStr.split(", ").length + "人\n"
                + "\t中:\t" + mStr + "\t总人数:" + mStr.split(", ").length + "人\n"
                + "\t低:\t" + lStr + "\t总人数:" + lStr.split(", ").length + "人\n";
        v.set(s);
        context.write(k, v);
    }
}

3.Job阶段代码

package com.studentExam.classscore;

import com.Drive;
import org.apache.hadoop.io.Text;

import java.io.IOException;
import java.net.URISyntaxException;

/**
 * $功能描述: run
 *
 * @author :smart-dxw
 * @version : 2019/6/19 22:02 v1.0
 */
public class AvgClassRun {

    public static void main(String[] args) throws ClassNotFoundException, URISyntaxException, InterruptedException, IOException {
        args = new String[]{
                "C:\\studentExam\\01\\in",
                "C:\\studentExam\\01\\AvgClassRun"
        };
        Drive.run(AvgClassRun.class,
                AvgClassMapper.class,
                Text.class,
                Text.class,
                AvgClassReducer.class,
                Text.class,
                Text.class,
                args[0],
                args[1]);
    }
}

结果

课程Computer:
	甲级:	zhugeliang, houzi, jinzha	总人数:3人
	乙级:	hanxin, nezha	总人数:2人
	丙级:	liudehua	总人数:1人

课程English:
	甲级:	zhugeliang, houzi	总人数:2人
	乙级:	liudehua, libai, nezha	总人数:3人
	丙级:	hanxin, jinzha	总人数:2人

课程Math:
	甲级:	zhugeliang, nezha	总人数:2人
	乙级:	hanxin, libai	总人数:2人
	丙级:	muzha, houzi, jinzha	总人数:3人

感谢老铁支持:驱动类看另外一个地址

https://blog.csdn.net/hengyufxh1/article/details/93249741

老铁加油:我在工地等你!

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MapReduce之MR处理:按课程排学生名词以及最高最低平均分数 的相关文章

随机推荐

  • Linux 内核配置选项(转)

    Linux 内核配置选项 from http www mitbbs com mitbbs article t php board 61 Linux amp gid 61 10715608 amp ftype 61 0 第一部分 01 Cod
  • Cortex-M3双堆栈MSP和PSP

    什么是栈 xff1f 在谈M3堆栈之前我们先回忆一下数据结构中的栈 栈是一种先进后出的数据结构 类似于枪支的弹夹 xff0c 先放入的子弹最后打出 xff0c 后放入的子弹先打出 M3内核的堆栈也不例外 xff0c 也是先进后出的 栈的作用
  • 烧毁DC/DC电路问题

    使用芯龙半导体的XL7005A DC DC芯片 已经很多年了 xff0c 用的也很稳定 这次在做一个设备的时候 xff0c 系统上电就会烧DC DC芯片以及系统电路中的LDO和MCU等 试了很多次终于发现规律了 xff0c DC DC电路就
  • FreeRTOS内核全局变量

    想要分析FreeRTOS源码 xff0c 想要理解FreeRTOS源码的整个宏观架构 xff0c 有一个前提就是必须知道FreeRTOS内核中那些全局变量的意义 xff0c 每个全局变量都是用来干什么的 只有了解了这些全局变量我们才能从宏观
  • 基于LWIP协议栈RAW API的 UDP传输实验

    什么是UDP xff1f UDP是用户数据报协议 xff0c 是OSI参考模型中的传输层协议 UDP的特点 缺点 xff1a 无连接的 xff0c 不可靠的 xff0c 不能保证数据安全到达目的地 优点 xff1a 消耗资源小 xff0c
  • 初识CANOpen

    什么是CANOpen CANOpen是位于CAN总线之上的一个应用层协议 CAN总线只规定了物理层和数据链路层 xff0c 有了这两层 xff0c 数据就可以在CAN总线上传输了 我们和哪个设备通信就和哪个设备约定好 xff0c 哪个ID代
  • STM32单片机被锁无法烧写程序解决办法

    以前遇到无法烧写程序的问题 在开发中 xff0c 单片机突然无法烧写程序 xff0c 这种情况相信大家应该都遇到过 比如烧写程序引脚被设置为别的功能 这种情况也是最常见的 我们可以把复位电容短路 xff0c 让单片机复位 xff0c 然后点
  • STM32F407以太网DMA描述符和数据链路层收发数据

    本文主要介绍STM32F407单片机MAC内核的DMA描述符 xff0c 以及如何实现以太网二层的数据收发 这一篇先实现数据链路层的正常收发 xff0c 下一篇再去介绍如何把LWIP移植到单片机上 大部分资料都是把LWIP移植和以太网卡驱动
  • linux查看日志常用命令

    线上环境出现问题 xff0c 熟悉常用的日志操作命令 xff0c 对有效的排查出问题至关重要 下面将介绍一些常用的命令 xff0c 一起学习下 1 tail命令 xff08 查询日志文件尾部 xff09 tail f 日志文件 xff1a
  • 定时事件链表

    本文主要写的是 xff1a 将需要定时的事件作为一个链表节点添加到链表中 所写代码是从LWIP源码中复制出来的 xff0c 稍作修改 当阅读到lwip源码timers c文件中的sys timeout函数时 xff0c 觉得非常适合如下一种
  • LAN8720A芯片

    LAN8720A是一个10 100M 的以太网PHY芯片 带有SMI接口 xff0c 支持RMII LAN8720A各个管脚的功能 xff1a MDIO MDC是站管理接口 SMI接口 引脚 SMI是标准接口 xff0c 比如交换机芯片一般
  • 无刷无霍尔BLCD电机控制

    声明 xff1a 本文出自百度文库无刷无霍尔电机控制 xff0c 因为该文为繁体 xff0c 看起来特别别扭 xff0c 特此翻译 文库网址 xff1a span class hljs label https span wenku span
  • 如何高效阅读一篇论文?来自18位教授、主编和博士生的最好建议!

    撰文 Elisabeth Pain xff08 翻译 何伟雄 xff1b 审校 魏潇 xff09 文章来源自公众号科研圈 xff08 ID xff1a keyanquan xff09 即便是专业的科研从业者 xff0c 也无法做到像看小说一
  • 了解FreeRTOS操作系统

    对于初学者来说 xff0c 想要弄懂FreeRTOS操作系统 xff0c 首先需要知道FreeRTOS需要包含哪些文件 xff0c 从官网 https sourceforge net projects freertos files 上下载的
  • Windows程序的入口是哪里?写出Windows消息机制的流程

    Windows程序的入口是WinMain 函数 Windows应用程序消息处理机制 xff1a A 操作系统接收应用程序的窗口消息 xff0c 将消息投递到该应用程序的消息队列中 B 应用程序在消息循环中调用GetMessage函数从消息队
  • Linux内核编译与安装:4.4.0-21→4.14.0

    1 背景 从事Linux环境下开发工作 xff0c 一直想自己玩 xff0c 纯属好奇 xff0c 没撒背景 2 编译环境 zg Linux etc uname a xff08 查看内核 xff09 Linux zg Linux 4 4 0
  • gazebo的学习与使用

    Gazebo教程 xff08 使用roslaunch启动Gazebo world文件和URDF模型 xff09 启动Gazebo xff0c 打开world模型以及向仿真环境中插入机器人模型的方法有很多 xff0e 在这个教程中 xff0c
  • KDD2019经典论文奖-CELF算法实现

    数据挖掘 KDD 领域 CELF 已成为一种经典的 社会网络影响最大化发现算法 xff0c 用于 改进贪心算法 的 效率 提升 700 获得 KDD 2019 的 经典论文 奖 xff0c 作者 xff1a Jure Leskovec xf
  • 英语常用短语1

    What are you trying to say xff08 你到底想说什么 xff1f xff09 Don 39 t be silly xff08 别胡闹了 xff09 How strong are your glasses xff0
  • MapReduce之MR处理:按课程排学生名词以及最高最低平均分数

    根据此篇文章可以熟练使用Reduce阶段进行分组 xff0c 并且了解jdk8新特性代码 我们开看下原始数据 某地方编辑的txt文件数据不是太大 xff1a English liudehua 80 English lijing 79 Eng