Mapreduce | 案例

news2024/11/20 14:29:09

根据提供的数据文件【test.log】

数据文件格式:姓名,语文成绩,数学成绩,英语成绩

完成如下2个案例:

(1)求每个学科的平均成绩

(2)将三门课程中任意一门不及格的学生过滤出来

(1)求每个学科的平均成绩

  • 上传到hdfs

Idea代码:

package zz;

import demo5.Sort1Job;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

import java.io.IOException;

public class ScoreAverageDriver {
    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {

        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://hadoop10:8020");

        Job job = Job.getInstance(conf);
        job.setJarByClass(ScoreAverageDriver.class);

        job.setInputFormatClass(TextInputFormat.class);
        job.setOutputFormatClass(TextOutputFormat.class);

        TextInputFormat.addInputPath(job,new Path("/test.log"));
        TextOutputFormat.setOutputPath(job,new Path("/test1"));

        job.setMapperClass(ScoreAverageMapper.class);
        job.setReducerClass(ScoreAverageReducer.class);
        //map输出的键与值类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        //reducer输出的键与值类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        boolean b = job.waitForCompletion(true);
        System.out.println(b);

    }



    static class ScoreAverageMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
        // 定义一个Text类型的变量subject,用于存储科目名称
        private Text subject = new Text();
        // 定义一个IntWritable类型的变量score,用于存储分数
        private IntWritable score = new IntWritable();

        // 重写Mapper类的map方法
        @Override
        protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
            // 将输入的Text值转换为字符串,并按逗号分割成数组
            String[] fields = value.toString().split(",");
            // 假设字段的顺序是:姓名,语文成绩,数学成绩,英语成绩
            String name = fields[0]; // 提取姓名
            int chinese = Integer.parseInt(fields[1]); // 提取语文成绩
            int math = Integer.parseInt(fields[2]); // 提取数学成绩
            int english = Integer.parseInt(fields[3]); // 提取英语成绩

            // 为Chinese科目输出成绩
            subject.set("Chinese"); // 设置科目为Chinese
            score.set(chinese); // 设置分数为语文成绩
            context.write(subject, score); // 写入输出

            // 为Math科目输出成绩
            subject.set("Math"); // 设置科目为Math
            score.set(math); // 设置分数为数学成绩
            context.write(subject, score); // 写入输出

            // 为English科目输出成绩
            subject.set("English"); // 设置科目为English
            score.set(english); // 设置分数为英语成绩
            context.write(subject, score); // 写入输出
        }
    }


    static class ScoreAverageReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        // 定义一个IntWritable类型的变量average,用于存储平均分数
        private IntWritable average = new IntWritable();

        // 重写Reducer类的reduce方法
        @Override
        protected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
            int sum = 0; // 初始化分数总和为0
            int count = 0; // 初始化科目成绩的个数为0

            // 遍历该科目下的所有分数
            for (IntWritable val : values) {
                sum += val.get(); // 累加分数
                count++; // 计数加一
            }

            // 如果存在分数(即count大于0)
            if (count > 0) {
                // 计算平均分并设置到average变量中
                average.set(sum / count);
                // 写入输出,键为科目名称,值为平均分数
                context.write(key, average);
            }
        }
    }




    }
  • 结果:

 

(2)将三门课程中任意一门不及格的学生过滤出来

  •  Idea代码
package zz;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

import java.io.IOException;

public class FailingStudentDriver {

    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {

        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://hadoop10:8020");

        Job job = Job.getInstance(conf);
        job.setJarByClass(FailingStudentDriver .class);

        job.setInputFormatClass(TextInputFormat.class);
        job.setOutputFormatClass(TextOutputFormat.class);

        TextInputFormat.addInputPath(job,new Path("/test.log"));
        TextOutputFormat.setOutputPath(job,new Path("/test2"));

        job.setMapperClass(FailingStudentMapper.class);

        //map输出的键与值类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        job.setNumReduceTasks(0);

        boolean b = job.waitForCompletion(true);
        System.out.println(b);


    }

    // 定义一个静态类FailingStudentMapper,它继承了Hadoop的Mapper类
// 该Mapper类处理的是Object类型的键和Text类型的值,并输出Text类型的键和NullWritable类型的值
    static class FailingStudentMapper extends Mapper<Object, Text, Text, NullWritable> {

        // 定义一个Text类型的变量studentName,用于存储不及格的学生姓名
        private Text studentName = new Text();

        // 定义一个NullWritable类型的变量nullWritable,由于输出值不需要具体的数据,所以使用NullWritable
        private NullWritable nullWritable = NullWritable.get();

        // 重写Mapper类的map方法,这是处理输入数据的主要方法
        @Override
        protected void map(Object key, Text value, Mapper<Object, Text, Text, NullWritable>.Context context) throws IOException, InterruptedException {

            // 将输入的Text值转换为字符串,并按逗号分割成数组
            // 假设输入的Text值是"姓名,语文成绩,数学成绩,英语成绩"这样的格式
            String[] fields = value.toString().split(",");

            // 从数组中取出学生的姓名
            String name = fields[0];

            // 从数组中取出语文成绩,并转换为整数
            int chineseScore = Integer.parseInt(fields[1]);

            // 从数组中取出数学成绩,并转换为整数
            int mathScore = Integer.parseInt(fields[2]);

            // 从数组中取出英语成绩,并转换为整数
            int englishScore = Integer.parseInt(fields[3]);

            // 检查学生的三门成绩中是否有任意一门不及格(即小于60分)
            // 如果有,则将该学生的姓名写入输出
            if (chineseScore < 60 || mathScore < 60 || englishScore < 60) {
                studentName.set(name); // 设置studentName变量的值为学生的姓名
                context.write(studentName, nullWritable); // 使用Mapper的Context对象将学生的姓名写入输出
            }
        }
    }
        }

  • 结果:

 

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

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

相关文章

DVWS靶场全总结(详细)--主要用来复习(暂未完善,累了大体框架已成)

目录 一、环境安装 二、开始闯关 2.1暴力破解 2.1.1 low: 2.1.2 medium: 2.2命令注入 2.2.1 low: ​编辑​编辑 2.2.2 medium: 2.3跨站请求伪造&#xff08;CSRF&#xff09; 2.3.1 low: 2.3.2 medium: 2.4文件包含漏洞 2.4.1 low&#xff1a; 2.4.2 medium: 2.…

暴力数据结构之栈与队列(队列详解)

1.队列的定义 队列是一种特殊的线性表&#xff0c;它遵循先进先出&#xff08;FIFO&#xff09;的原则。在队列中&#xff0c;只允许在表的一端进行插入操作&#xff08;队尾&#xff09;&#xff0c;而在另一端进行删除操作&#xff08;队头&#xff09;。这种数据结构确保了最…

【栈】Leetcode 比较含退格的字符串

题目讲解 844. 比较含退格的字符串 算法讲解 使用栈模拟&#xff0c;但遇到#字符就让栈顶元素出栈&#xff0c;但是在写的过程中有两点需要注意&#xff1a;当#出现在第一个位置&#xff0c;需要特殊处理一下&#xff1b;当栈为空的时候&#xff0c;还出现#字符需要特殊处理…

普通人可以抓住黄金价格大涨的投资机会吗?

黄金价格的波动对于投资者来说&#xff0c;总是充满了诱惑和挑战。近期&#xff0c;全球经济形势变化多端&#xff0c;地缘政治冲突频发&#xff0c;这些因素无不对黄金市场造成影响&#xff0c;使得黄金价格出现大幅波动。那么&#xff0c;作为普通人&#xff0c;能否抓住黄金…

会赚钱的人都在做这件事:你了解吗?

在我们日常生活的点滴中&#xff0c;以及在各种场合的交互中&#xff0c;利他思维始终扮演着不可或缺的角色。当我们追求合作与共赢时&#xff0c;单方面的自我立场显然是不够的&#xff0c;真正的关键在于换位思考&#xff0c;寻找并满足对方的需求。 互利互赢的核心理念正是利…

centos安装mysql-client

直接安装&#xff1a; yum install mysql-community-client报了错误No package mysql-community-client available. 原因&#xff1a;CentOS/RHEL系统默认的软件源中并不包含MySQL软件包&#xff0c;需要通过添加第三方存储库来获取MySQL相关软件 添加源 安装MySQL官方的Yum…

【智能优化算法】白鲨智能优化算法(White Shark Optimizer,WSO)

白鲨智能优化算法(White Shark Optimizer,WSO)是期刊“KNOWLEDGE-BASED SYSTEMS”&#xff08;中科院一区期刊 IF8.6&#xff09;的2022年智能优化算法 01.引言 白鲨智能优化算法(White Shark Optimizer,WSO)的核心理念和基础灵感来自大白鲨的行为&#xff0c;包括它们在导航和…

关于Ardupilot的固定翼(plane)的控制

起因 由于项目原来是使用的四旋翼,并且是PX4版本的四旋翼; 如今需要对无人机固定翼进行控制,并要求使用Ardupilot的固件进行研究。 特定在此记录对固定翼的学习,以和大家分享观点和交流学习。 PX4和Ardupilot关系 PX4和Ardupilot都是固件,固件就是软件的意思。两者都是…

Amesim基础篇-热仿真常用模型库-Air Conditioning-Pipes

前言 基于上文对空调库各个元件的介绍&#xff0c;本文进一步将其中的管路展开。 管路介绍 1 摩擦阻力管&#xff08;R&#xff09;&#xff1a; 具有阻力特性的管路&#xff0c;通过管长以及管截面计算阻力。 2 可调节阻力管&#xff08;R&#xff09;&#xff1a; 只具有…

进一步解读英伟达 Blackwell 架构、NVlink及GB200 超级芯片

2024年3月19日&#xff0c;英伟达CEO黄仁勋在GTC大会上公布了新一代AI芯片架构BLACKWELL&#xff0c;并推出基于该架构的超级芯片GB200&#xff0c;将助推数据处理、工程模拟、电子设计自动化、计算机辅助药物设计、量子计算和生成式 AI 等领域。 为了纪念杰出的数学家David H…

设计合理的IT运维服务目录:打造高效运维的蓝图

在数字化转型的浪潮中&#xff0c;一个设计合理、内容详尽的IT运维服务目录是连接服务提供者与消费者之间的桥梁&#xff0c;它不仅体现了服务设计的专业性&#xff0c;还直接影响着运维效率和服务质量。如何设计出既合理又高效的IT运维服务目录&#xff1f;让我们结合ITIL 4框…

赣红孵联合卫东街道未保站开展未成年人保护法散落在每个角落活动

为进一步提高家长的法治意识&#xff0c;依法保障未成年人的合法权益&#xff0c;全力构建安全和谐文明家庭&#xff0c;5月8日&#xff0c;赣红孵社会组织培育中心联合卫东街道未成年人保护站在在南师附小红谷滩校区实验小学开展“未成年人保护法散落在每个角落”未成年人普法…

浅谈云计算资源和服务

目录 前言 正文 专有名词及其首字母缩写 轻量级应用服务器 云服务器ECS 专有网络VPC 其他类服务 尾声 &#x1f52d; Hi,I’m Pleasure1234&#x1f331; I’m currently learning Vue.js,SpringBoot,Computer Security and so on.&#x1f46f; I’m studying in University o…

上海晋名室外危废暂存间助力科教产业危废品安全储存

本周又有两台SAVEST室外危废暂存间项目成功验收交付使用&#xff0c;此次项目主要用于用户园区内固废、废液等危废品室外暂存安全。 用户单位在日常工作运营中涉及到园区内固废、废液等危废品的室外安全储存问题&#xff0c;用户在寻找解决方案的过程中搜索到上海晋名的室外暂…

Java入门基础学习笔记11——关键字和标识符

1、关键字 关键字是java中已经被赋予特定意义的&#xff0c;有特殊作用的一些单词&#xff0c;不可以把这些单词作为标识符来使用。 注意&#xff1a;关键字是java用了的&#xff0c;我们就不能用来作为&#xff1a;类名、变量名、否则会报错。 标识符&#xff1a; 标识符就是…

2024C题生物质和煤共热解问题的研究 详细思路

背景 随着全球能源需求的不断增长和对可再生能源的追求&#xff0c;生物质和煤共热解作为一种潜在的能源转化技术备受关注。生物质是指可再生能源&#xff0c;源自植物和动物的有机物质&#xff0c;而煤则是一种化石燃料。** 在共热解过程中&#xff0c;生物质和煤在高温和缺氧…

【C++】-类模板-002

1创建类模板 &#xff08;1&#xff09;新建工程 &#xff08;2&#xff09; &#xff08;3&#xff09; &#xff08;4&#xff09; &#xff08;5&#xff09;模板运行结果 2【UI】设计器 &#xff08;1&#xff09;跳转到【UI】设计器 &#xff08;2&#xff09;添加…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.4讲 GPIO中断实验-IRQ中断服务函数详解

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

weblogic 反序列化 [CVE-2017-10271]

一、漏洞描述 这个漏洞是wls-wsat这个接口出了问题&#xff0c;Weblogic的WLS Security组件对外提供webservice服务&#xff0c;其中使用了XMLDecoder来解析用户传入的XML数据&#xff0c;在解析的过程中出现反序列化漏洞&#xff0c;导致可执行任意命令。攻击者发送精心构造的…

C++|二叉搜索树

一、二叉搜索树的概念 二叉搜索树又称为二叉排序树&#xff0c;它或者是一颗空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根结…