Advertisement

MapReduce求最大值最小值平均值案例

阅读量:

该文本介绍了如何利用Hadoop MapReduce框架对学校班级学生的考试成绩数据进行处理,并提取每个学生的最高分、平均成绩(整数)和最低分。具体步骤如下:
Map阶段:将输入的成绩数据按逗号分割后,以学生姓名为键、分数为值进行转换。
Reduce阶段:通过Java Streams对所有学生成绩进行计算:

  • 使用mapToDouble方法将分数转换为double类型。
  • 使用max()方法获取最高分。
  • 使用min()方法获取最低分。
  • 使用average()方法计算平均成绩(整数)。
    输出格式化结果显示每个学生的最高分、平均成绩和最低分。
    最终结果会以特定格式写入存储位置中。

一、问题描述

学校的全校学生构成一个规模庞大的数据资源群体。
现在针对某班学生收集了一个月的学习成绩统计数据。
以下是具体学业表现表格:
科目 姓名 分数

在这里插入图片描述

求出每个学生的最高分,平均成绩(整数(不能使用强制类型转换)),最低分。

二、思路介绍

在map阶段将学生姓名作为key、成绩作为value进行处理;在reduce阶段对最大值、最小值及平均值进行计算。

三、代码实现

1、Map阶段

复制代码
    package com.studentscore;
    
    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 ScoreMap extends Mapper<LongWritable, Text, Text, IntWritable> {
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //获取行
        String line = value.toString();
        //按逗号切分
        String[] split = line.split(",");
        //将学生名作为key,分数作为value输出
        context.write(new Text(split[1]), new IntWritable(Integer.parseInt(split[2])));
    }
    }

2、Reduce阶段

复制代码
    package com.studentscore;
    
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.NullWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Reducer;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    public class ScoreReduce extends Reducer<Text, IntWritable, Text, NullWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        //创建List对象存储学生成绩
        List<Integer> scoreList = new ArrayList<>();
        //将学生成绩写入List
        for (IntWritable score : values) {
            scoreList.add(score.get());
        }
        //输出
        double scoreMax = scoreList.stream().mapToDouble(Integer::byteValue).max().getAsDouble();
        double scoreMin = scoreList.stream().mapToDouble(Integer::byteValue).min().getAsDouble();
        double scoreAvg = scoreList.stream().mapToDouble(Integer::byteValue).average().getAsDouble();
        context.write(new Text(key + ":"
                + "\t" + "最高分" + Math.round(scoreMax) + ","
                + "\t" + "平均分" + Math.round(scoreAvg) + ","
                + "\t" + "最低分" + Math.round(scoreMin) + ";"), NullWritable.get());
    }
    }

3、驱动程序

复制代码
    package com.studentscore;
    
    import com.utils.Driver;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.NullWritable;
    import org.apache.hadoop.io.Text;
    
    import java.io.IOException;
    
    public class ScoreDriver {
    public static void main(String[] args) throws InterruptedException, IOException, ClassNotFoundException {
        //调用工具类Driver执行驱动程序
        Driver.run(ScoreDriver.class, ScoreMap.class, Text.class, IntWritable.class,
                ScoreReduce.class, Text.class, NullWritable.class,
                "D:\ Bigdata\ StudentScore\ studentscore.txt",
                "D:\ Bigdata\ StudentScore\ Result");
    }
    }

四、结果展示

在这里插入图片描述
在这里插入图片描述

全部评论 (0)

还没有任何评论哟~