mapreduce 班级学生成绩统计

2023-05-16

这个是最近的一个实验,其中这个实验老师的要求是

1 统计每个班成绩的最大值 最小值 并且输出姓名 如果有多个那么要都要输出 ,然后输出每个班的平均值 再者就是每个班的成绩分布,优秀良好,及格不及格的个数

2 统计全部成绩的最大值最小值 要求如上 

其中有一些思路可以说一下,一开始我是准备创建一个对象数组来存储每个班级的 最大值 最小值 姓名 还有总和 个数 但是这样很麻烦,因为要初始化,还有班级的个数,这一些都要处理 所以最后直接用变量来统计, 其中map就很简单了,就是把班级作为key value的属性是 班级 姓名 还有成绩,在reduce下 这是总共学生属性的变量还有班级学生的属性,这里可以看代码,初始化的位置不同,就是在每次处理完一个班级后,更新总共的属性 然后输出该班级的结果 当班级到达总共的时候输出总共的属性就可以,剩下的就是一些if else 判断也没有什么

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class classsorce {

    public static class getmap extends Mapper<Object,Text,Text,Text> {
        public void map(Object key,Text value,Context context)throws IOException,InterruptedException {



            String[] line = value.toString().split("\\s+");
            String class_id = line[0];
            String name_id = line[1];
            String grade_id = line[2];
            String class_key = class_id.substring(8,10);
            context.write(new Text(class_key),new Text(class_id+" "+name_id+" "+grade_id));
        }
    }
    public static class getreduce extends Reducer<Text,Text,Text,Text> {
        int cnt = 0;
        int total_max = 0;
        int total_min = 100;
        String total_max_name;
        String total_min_name;
        int[] total_allocation = {0,0,0,0,0};
        int total_sum = 0;
        int total_student = 0;

        public void reduce(Text key,Iterable<Text> value,Context context) throws IOException,InterruptedException {
            int[] grade_allocation = {0,0,0,0,0};
            int grade_max = 0;
            int grade_min = 100;
            int grade_sum = 0;
            int number_student = 0;
            String grade_name_max = "";
            String grade_name_min = "";
            String[] grade_description = {"优秀", "良好", "中等", "及格", "不及格"};
            String class_name= "";
            String space = "        ";
            for(Text lines : value) {
                String[] line = lines.toString().split("\\s+");
                if(line.length == 3) {
                    String id = line[0];
                    String grade = line[2];
                    String name1 = line[1];

                    class_name = id;
                    int grade1 = Integer.parseInt(grade);
                    grade_sum += grade1;
                    number_student++;
                    // 计算成绩等级
                    int tmp = grade1/10;
                    if(tmp <= 5) {
                        grade_allocation[0]+=1;
                    }
                    else if(tmp >= 6){
                        if(tmp == 10)
                            tmp = tmp-6;
                        else
                            tmp = tmp - 5;
                        grade_allocation[tmp] = grade_allocation[tmp]+1;
                    }
                    //更新最大值 以及姓名
                    if(grade1 > grade_max) {
                        grade_max = grade1;
                        grade_name_max = name1 +" ";
                    }
                    else if(grade1 == grade_max) {
                        grade_name_max += name1+ " ";
                    }
                    //更新最小值以及姓名
                    if(grade1 < grade_min) {
                        grade_min = grade1;
                        grade_name_min = name1 + " ";
                    }
                    else if(grade1 == grade_min) {
                        grade_name_min += name1 + " ";
                    }

                }
            }
            //更新全部学生的属性
            total_student+= number_student;
            total_sum += grade_sum;
            cnt++;
            //更新最大值最小值
            if(grade_max > total_max) {
                total_max = grade_max;
                total_max_name = grade_name_max + " " + class_name.substring(8,10) + " ";
            }
            else if(grade_max == total_max) {
                total_max_name += grade_name_max + " " + class_name.substring(8,10) + " ";
            }
            if(grade_min < total_min) {
                total_min = grade_min;
                total_min_name = grade_name_min + " " + class_name.substring(8,10) + " ";
            }
            else if(grade_min == total_min) {
                total_min_name += grade_name_min +" " + class_name.substring(8,10) + " ";
            }
            for(int i = 0;i < 5;i++){
                total_allocation[i] += grade_allocation[i];
            }
            //写入一个班的成绩统计
            context.write(new Text("class : " + class_name.substring(8,10)),new Text("average : " + Double.toString(grade_sum*1.0/number_student)));
            String[] put_max = grade_name_max.split("\\s+");
            String[] put_min = grade_name_min.split("\\s+");
            for(int i = 0;i < put_max.length;i++){
                context.write(new Text(space),new Text("max_grade : " + put_max[i] + " " + Integer.toString(grade_max)));
            }
            for(int i = 0;i < put_min.length;i++){
                context.write(new Text(space),new Text("min_grade : " + put_min[i] + " "+ Integer.toString(grade_min)));
            }
            for(int i = 0;i < 5;i++){
                context.write(new Text(space + grade_description[i] + " : "),new Text(Integer.toString(grade_allocation[i])));
            }
            //写入全部班级的成绩统计
            if(cnt == 10){
                context.write(new Text("average : " ) ,new Text(Double.toString(total_sum*1.0/total_student)));
                String[] puttotalmax = total_max_name.split("\\s+");
                String[] puttotalmin = total_min_name.split("\\s+");
                context.write(new Text(space+ "totalmax_grade : ") ,new Text(Integer.toString(total_max)));
                for(int i = 0;i < puttotalmax.length;i+=2) {

                    context.write(new Text(space),new Text( " " + puttotalmax[i] + " " +puttotalmax[i+1]));
                    //i+=2;
                }
                context.write(new Text(space+ "totalmin_grade : ") ,new Text(Integer.toString(total_min)));
                for(int i = 0;i < puttotalmin.length;i+=2) {
                    context.write(new Text(space),new Text( "" + puttotalmin[i] + " " + puttotalmin[i+1]));
                    //i+=2;
                }
                for(int i = 0;i < 5;i++) {
                    context.write(new Text(space + grade_description[i] + " : " ),new Text(Integer.toString(total_allocation[i])));
                }
            }
        }
    }
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();

        Job job = Job.getInstance(conf,"classscore");
        job.setJarByClass(classsorce.class);
        job.setMapperClass(getmap.class);
        job.setReducerClass(getreduce.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);
        FileInputFormat.addInputPath(job,new Path("hdfs://192.168.200.132:9000/home/fym/input2"));
        FileOutputFormat.setOutputPath(job,new Path("hdfs://192.168.200.132:9000/home/fym/output2"));//(job,new Path(otherArgs[1]));
        System.exit(job.waitForCompletion(true)?0:1);
        System.out.println("end");
    }
}

 

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

mapreduce 班级学生成绩统计 的相关文章

  • flutter报错: Gradle threw an error while downloading artifacts from the network. Retrying

    项目之前是可以正常运行的 xff0c 突然就报这个错误了 Gradle threw an error span class token keyword while span downloading artifacts span class
  • webpack:1 概念

    loader的作用 xff1a 是用来处理不同类型的文件 xff0c 操作的是文件 plugin的作用 xff1a 是一个扩展器 xff0c 不操作文件 xff0c 用来增强功能 其它webpack的使用看webpack原汁原味的 官网 高
  • 数据库: mongodb导入json数据

    登录聚合数据 xff0c 找些免费的api请求后下载成json文件 xff0c 去掉多余的格式只保留数组格式 xff0c 选择json文件即可导入成功 可以看资源 xff1a 新闻头条新闻头条新闻头条 carc1subject1 json
  • webpack: 4 loader汇总(style-loader等)

    所有的loader必须匹配规则 xff0c 否则不生效 配置文件中 xff0c module中rules的use执行顺序是从后往前执行 url loader 用于将文件转换为base64 URI的webpack加载程序 options li
  • webpack: 5 报错,错误

    webpack 报错 xff1a Uncaught ReferenceError is not defined webpack webpack打包jquery的插件 xff08 EasyLazyLoad xff09 时 xff0c 报错 方
  • Vue:无限滚动-通过vant组件

    一 xff1a 下拉刷新上拉加载功能 1 实现原理 xff1a 通过vant的List和PullRefresh两个组件实现 xff08 PullRefresh组件标签包裹List组件标签 xff09 2 我遇到的问题 Load方法触发的次数
  • webpack:打包示例-打包多入口

    入口 entry 前台 index 39 public assets js index 39 打包入口项 list 39 public assets js list 39 search 39 public assets js search
  • kubernetes基础——一文读懂k8s

    容器 容器与虚拟机对比图 左边为容器 右边为虚拟机 容器技术是虚拟化技术的一种 xff0c 以Docker为例 xff0c Docker利用Linux的LXC LinuX Containers 技术 CGroup Controll Grou
  • curl错误28:Resolving timed out after 15009 milliseconds解决方案

    报错信息如字面意思就是连接超时了 xff0c 解决方案如下 xff1a 1 检查Curl的超时参数 xff0c 如果设置小于1s的超时时间 xff0c curl会直接返回超时错误 xff08 28 xff09 xff0c 并不会发起任何的请
  • Linux 可视化桌面远程连接

    Linux xff08 一 xff09 防止系统文件修改导致DNS清空 chattr 43 i etc resolv conf xff08 二 xff09 安装vnc yum install y tigervnc tigervnc serv
  • C-Free5注册码,秘钥,解决办法

    C Free5注册码 xff0c 秘钥 xff0c 解决办法 用户名 xff1a 123123 电子邮件 xff1a 111 64 qq com 注册码 xff1a mJ2Em9jdm7jGwYTpmp2H6KmehtvO 显示让重启电脑
  • Ubuntu16.04将python命令指向python3

    第一步 xff1a 将原来的python文件进行备份 sudo cp usr bin python usr bin python bak 第二步 xff1a 删除原来指向python2的文件 sudo rm usr bin python 第
  • 素数伴侣

    题目 xff1a 解析 xff1a 本题目采用了匈牙利算法 xff0c 起初以为只是找到所有的素数伴侣 xff0c 但是题目有一个条件 xff0c 那就是每个数字只能使用一次 xff0c 组成拥有最多的素数伴侣 代码产出 xff1a spa
  • 接之前的SpringBoot项目通过金蝶中间件部署中未处理的问题

    新建的springboot项目是2 3 1的版本 xff0c 打包到金蝶中部署就一直栈内存溢出 后来把pom文件中的父依赖换成了2 2 4版本 xff0c 打包部署到金蝶中就能运行了 xff0c 我也不知道具体原因 如果有知道具体原因的请不
  • 如何解决centos虚拟机每次启动都要自己登录root问题

    解决办法 xff1a 可以通过修改 etc gdm custom conf文件 xff0c 实现root用户免密码自动登陆 1 输入命令vi etc gdm cutstom conf 2 在 daemon 下增加 需要插入时按i进行插入模式
  • 关于word中最后一个分节符导致的空白页删除问题

    主要原因 xff1a 一般最后一个空白页出现的原因有两个 xff0c 一个是分节符或者分页符导致 xff0c 另一个是上一页内容太多顶出来导致多一些 xff08 这种情况可以选择调节前面内容长度 xff0c 并设置前页最后一个字符的行距 x
  • 逐层贪婪预训练(解决梯度消失的第一个成功方案,但现在除了NLP领域外很少使用)

    起因 背景 xff1a 梯度消失 vanishing gradient problem DNN的训练中 xff0c 由于梯度消失 xff0c 即输出层的错误在反向传播的过程中会显著地越来越小 xff0c 所以靠近输入层的层的梯度就接近0 x
  • 前端——块元素和内联元素的概念以及区别

    一丶块元素 xff1a 1 前后有换行符 xff0c 独占一行 xff0c 默认情况下 xff0c 垂直排列 2 默认情况下高度有内容决定 xff08 就比如由里边的图片和文字决定高度 xff09 xff0c 宽度是父级的宽度 xff0c
  • 【计算机网络】输入网址到显示网页,期间发生了什么?

    摘要 xff1a 如图1所示 xff0c 从输入网址 xff0c 按下回车键之后的数据传输流程发生了什么 注意 xff1a 各位大佬 xff0c 如果有哪里写的不清楚 xff0c 请在邮件pigmn 64 sina com友善的交流 图1
  • 灰度共生矩阵(超简单理解)

    1 灰度共生矩阵生成原理 灰度共生矩阵 GLDM 的统计方法是20世纪70年代初由R Haralick等人提出的 xff0c 它是在假定图像中各像素间的空间分布关系包含了图像纹理信息的前提下 xff0c 提出的具有广泛性的纹理分析方法 灰度

随机推荐

  • MATLAB基础(二)矩阵运算与可视化作图

    常见矩阵生成函数 zeros m n 生成一个 m 行 n 列的零矩阵 xff0c m 61 n 时可简写为 zeros n ones m n 生成一个 m 行 n 列的元素全为 1 的矩阵 m 61 n 时可写为 ones n eye m
  • eclipse 项目有红叉(解决方法)

    1 进入 eclipse xff0c 按图示操作 2 找到 General 下的 problems 双击 problems 就会在下 边提示你项目报错的原因 根据错误提示去解决就好 3 在弹出的problems删除错误信息
  • spring boot整合shiro(附带简单demo)

    shiro是目前主流的java安全框架 xff0c 主要用来更便捷的认证 xff0c 授权 xff0c 加密 xff0c 会话管理 废话不多说 xff0c 下面是一个简单的案例 xff0c Soring boot整合shiro xff1b
  • CUDNN_STATUS_NOT_INITIALIZED解决办法

    在某平台跑代码 xff0c 最开始尝试去训练 xff0c 发现训练成功后久终止 xff0c 修改部分参数后再次运行发现这个错误 CUDNN STATUS NOT INITIALIZED 解决方法 xff1a 就是python进程其实还在继续
  • 企业数据仓库总线架构、总线矩阵笔记 (第三篇)

    一 总线架构 维度建模的数据仓库中 xff0c 有一个概念叫Bus Architecture xff0c 中文一般翻译为 总线架构 总线架构是Kimball的多维体系结构 xff08 MD xff09 中的三个关键性概念之一 xff0c 另
  • Mininet使用教程

    注 xff1a 1 重要的链接 xff1a http mininet org walkthrough display startup options 2 IPv4与IPv6之间的地址转换 https www subnetonline com
  • 关系型数据库与非关系型数据库

    开发工作中我们常用的数据库大致分为关系型数据库和非关系型数据库两种 xff0c 那这两种到底是什么呢 xff1f 1 关系型数据库 所谓关系型数据库 xff0c 是建立在关系模型 基础上的数据库 关系模型由关系数据结构 关系操作集合 关系完
  • 深度学习常用优化算法moment/Adagrad/RMSProp/Adadelta/Adam

    1 经验风险和风险 经验风险是训练数据集的平均损失 xff0c 风险是整个数据群的预期损失 2 优化算法作用 在最小化目标函数方面的性能 xff0c 即减小训练误差 xff0c 而不是模型的泛化误差 3 深度学习的优化挑战 局部最小值 小批
  • K8S 快速入门(五)网络通信原理:Pod网络

    一 Pod网络 1 Pod结构 Pod的特点 xff1a 容器 1 有自己的IP地址 2 有自己的hostname 3 有自己的端口 Pod实际上可以理解为就是k8s云平台中的虚拟机 xff0c 而这个pod内部封装的是由docker引擎所
  • 代码优化之策略模式

    前言 xff1a 最近刚完成一个专项的代码codeing xff0c 今天花了一下午把代码优化了下 xff0c 总结了一些优化时用到的思想和方法 xff0c 后续也会继续补充好的代码习惯和最佳范式 策略模式 自我介绍 策略这个词应该怎么理解
  • python保存图片变色,与原始图像颜色不一致

    有时候将图片保存到本地会发现颜色与原来不一致 xff0c 有的变成相反的颜色了 针对这个问题 xff0c 我试了好多方法 xff0c 原理不大清楚 但多换一种保存方式就OK了 常用的有三种 xff1a 1 PIL span class to
  • 树莓派(Raspberry) WIFI 配置 (无显示器)

    目标 在没有显示器的情况下 xff0c 通过一根网线配置树莓派WIFI 然后开机自动连接WIFI xff0c 以后就可以直接通过主机通过VNC Viewer Putty也可以 控制树莓派 当然 xff0c 如果有网线也可以控制了 xff0c
  • 网站搭建教程(详细步骤 )

    目录 网站组成 一 服务器 二 网站程序 三 域名 四 空间基本介绍 搭建网站的基本步骤流程 教程解说 一 购买域名 二 购买服务器 三 相关配置 网站组成 一 服务器 什么是服务器 我们可以理解为一个容器 用来存放网站的内容部分 我们在互
  • c++11的regex使用

    首先不论在window下还是linux下 xff0c 你要通过c c 43 43 使用正则表达式 xff0c 你就必须包含所需的头文件regex 里面包含了所需的函数 xff0c 一般的第一步需要确定要匹配的模式pattern 使用rege
  • Qt信号与槽的五种连接方式

    qt信号与槽的五种连接方式 xff1a 1 默认连接 xff1a 如果是在同一线程等价于直连 xff0c 在不同线程等价于队列连接 2 直连 xff1a 信号在哪 xff0c 在哪个线程执行 xff08 最好只在同一线程中用 xff09 3
  • Android (Android studio3.0.1)一篇可以实现app多语言的转换(简单操作)的教程

    最近接触到了项目需要 xff0c 多语言的转换 网上有很多资料 xff0c 我整理一些 xff0c 简单适合自己使用的操作 第一步 打开Android studio 添加 Android Studio插件 AndroidLocalizati
  • Centos7部署java环境

    先更新 yum y update amp amp yum y upgrade 1 xff0c Wget 参考 xff1a https blog csdn net xieshen86 article details 125472698 htt
  • Ubuntu16.04安装deb包

    deb包是Debian xff0c Ubuntu等Linux发行版的软件安装包 xff0c 扩展名为 deb xff0c 是类似于rpm的软件包 xff0c Debian xff0c Ubuntu系统不推荐使用deb软件包 xff0c 因为
  • HCIE-RS面试--STP弊端

    1 收敛速度慢 监听状态15s是为了避免STP协议在收敛过程中产生临时环路 xff0c 让BPDU有足够的时间在整个网络进行传递 监听状态期间 xff0c MAC地址表受TC BPDU的影响会进行提前老化 xff0c 清除错误的MAC地址信
  • mapreduce 班级学生成绩统计

    这个是最近的一个实验 xff0c 其中这个实验老师的要求是 1 统计每个班成绩的最大值 最小值 并且输出姓名 如果有多个那么要都要输出 xff0c 然后输出每个班的平均值 再者就是每个班的成绩分布 xff0c 优秀良好 xff0c 及格不及