MapReduce Java API实例-统计平均成绩
发布日期:2025-04-11 23:38:41 浏览次数:11 分类:精选文章

本文共 3245 字,大约阅读时间需要 10 分钟。

基于MapReduce的平均成绩统计系统实现

MapReduce是一种灵活强大的数据处理框架,常用于大规模数据的统计与分析。在此案例中,我们将MapReduce应用于统计学的场景,具体目标是计算学生各科的平均成绩。以下将详细介绍系统的实现方法和步骤。

系统场景

系统的主要功能是对多个科目成绩文件进行处理,每个科目对应一个独立的成绩文件。文件内容格式为:姓名和成绩之间用一个空格分隔。例如,文件内容可能类似于“张三 85”、“李四 92”等。系统将读取这些文件,统计每个科目的平均成绩,并将结果输出。

实现细节

该系统分为三个主要部分:Map阶段、Reduce阶段以及Job配置。每个部分的功能如下:

Map阶段

Map阶段的主要任务是读取输入文件,解析每行数据,并将相关信息传递给Reduce阶段。具体实现如下:

package com.badao.averagegrade;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;import java.util.StringTokenizer;public class AverageGradeMapper extends Mapper
{ private Text word = new Text(); private IntWritable one = new IntWritable(1); @Override public void map(Text key, Text value, Context context) throws IOException, InterruptedException { String[] str = value.toString().split(" "); context.write(new Text(str[0]), new IntWritable(Integer.parseInt(str[1]))); }}

Reduce阶段

Reduce阶段的主要任务是根据Map阶段传递的数据,计算每个科目的总成绩并求平均值。具体实现如下:

package com.badao.averagegrade;import org.apache.hadoop.io.FloatWritable;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;public class AverageGradeReducer extends Reducer
{ private FloatWritable result = new FloatWritable(); @Override public void reduce(Text key, Iterable
values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set((float) sum / 3); context.write(key, result); }}

Job配置

Job配置文件负责定义作业的输入输出路径以及数据类型设置。具体配置如下:

package com.badao.averagegrade;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.FloatWritable;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Job;import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class AverageGradeJob {    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {        Job job = Job.getInstance(new Configuration(), "averagegrade");        job.setJarByClass(AverageGradeJob.class);        job.setMapperClass(AverageGradeMapper.class);        job.setReducerClass(AverageGradeReducer.class);        job.setMapOutputValueClass(IntWritable.class);        job.setOutputKeyClass(Text.class);        job.setOutputValueClass(FloatWritable.class);        FileInputFormat.addInputPath(job, new Path("/grade"));        FileOutputFormat.setOutputPath(job, new Path("/averageGrade3"));        job.waitForCompletion(true);    }}

使用说明

系统使用步骤如下:

  • 将三个成绩文件chinese.txt、math.txt、english.txt上传至HDFS集群。
  • 在Hadoop集群上运行AverageGradeJob这个Job文件。
  • 等待作业完成后,访问输出目录 /averageGrade3,可以看到每个科目的平均成绩文件。
  • 系统将处理多个科目成绩文件,每个文件对应一个科目,输出的文件名格式为“科目名_avg_score”。例如,math_avg_score将包含数学科目的平均成绩。

    注意事项

    在文件处理过程中,需要注意以下几点:

  • 文件格式必须严格遵循“姓名 学分”格式,且姓名和学分之间必须有一个空格分隔。
  • 如果文件在不同操作系统上创建,需要注意空格的格式是否一致。例如,Windows系统创建的空格可能与Linux系统不同。
  • 确保HDFS集群支持文件上传,并检查文件上传是否成功。
  • 在Reduce阶段,科目数的计算应根据实际数据调整,不能直接硬编码为3。
  • 通过以上实现,您可以轻松地统计多个科目学生的平均成绩,适用于大规模数据处理场景。

    上一篇:MapReduce Kmeans聚类算法
    下一篇:MapReduce Java API实例-统计单词出现频率

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2025年05月12日 03时08分15秒