MR学生成绩等级统计

MR学生成绩等级统计


数据:

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
背景:

学校的学生的是一个非常大的生成数据的集体,比如每次考试的成绩
现有一个班级的学生一个月的考试成绩数据。
科目 姓名 分数

需求:

求出每门成绩中属于甲级的学生人数和总人数
乙级的学生人数和总人数
丙级的学生人数和总人数
甲级(90及以上)乙级(80到89)丙级(0到79)
处理数据结果:
课程\t甲级\t学生1,学生2,…\t总人数

Map阶段:
package bigdata12.homework10.grade2;

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

import java.io.IOException;

/**
 * 学习成绩统计Map阶段
 * @author Fantome
 * @date 2019/6/19
 */
public class GradeMap extends Mapper<LongWritable, Text,Text,Text> {
    Text k=new Text();
    Text v=new Text();

    /**
     *
     * @param key LongWritable
     * @param value 输入信息:subject,name,grade
     * @param context
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void map(LongWritable key,
                       Text value,
                       Context context) throws IOException, InterruptedException {

        String[] splits = value.toString().split(",");
        //按subject在reduce端聚合
        k.set(splits[0]);
        v.set(splits[1]+"\t"+splits[2]);
        context.write(k,v);
    }
}
Reduce阶段:
package bigdata12.homework10.grade2;

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

import java.io.IOException;

/**
 * 学习成绩统计Reduce阶段
 * @author Fantome
 * @date 2019/6/19
 */
public class GradeReduce extends Reducer<Text,Text,Text, NullWritable> {
    Text k=new Text();

    /**
     * 获取学生信息并进行等级统计
     * @param subject 学科
     * @param infos 学科的学生成绩信息
     * @param context
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void reduce(Text subject, Iterable<Text> infos, Context context) throws IOException, InterruptedException {

        //聚合同一等级的学生姓名
        StringBuffer nameA =new StringBuffer();
        StringBuffer nameB =new StringBuffer();
        StringBuffer nameC =new StringBuffer();
        //对同一等级的学生进行计数
        int nameANum=0;
        int nameBNum=0;
        int nameCNum=0;

        for (Text info:infos){
            //info: name+\t+grade
            String[] splits = info.toString().split("\t");
            String name=splits[0];
            int grede=Integer.parseInt(splits[1]);
            if(grede>=90){
                nameA.append(name+":"+grede+",");
                nameANum+=1;
            }else if(grede>=80){
                nameB.append(name+":"+grede+",");
                nameBNum+=1;
            }else {
                nameC.append(name+":"+grede+",");
                nameCNum+=1;
            }
        }
        //输出    课程\t甲级\t学生1,学生2,...\t总人数
        k.set(subject+"\t甲级\t"+nameA+"\t"+nameANum+"人\r\n"+
                subject+"\t乙级\t"+nameB+"\t"+nameBNum+"人\r\n"+
                subject+"\t丙级\t"+nameC+"\t"+nameCNum+"人");
        context.write(k,NullWritable.get());
    }
}
结果:在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值