
MapReduce Java API实例-统计平均成绩
将三个成绩文件chinese.txt、math.txt、english.txt上传至HDFS集群。 在Hadoop集群上运行AverageGradeJob这个Job文件。 等待作业完成后,访问输出目录 文件格式必须严格遵循“姓名 学分”格式,且姓名和学分之间必须有一个空格分隔。 如果文件在不同操作系统上创建,需要注意空格的格式是否一致。例如,Windows系统创建的空格可能与Linux系统不同。 确保HDFS集群支持文件上传,并检查文件上传是否成功。 在Reduce阶段,科目数的计算应根据实际数据调整,不能直接硬编码为3。
发布日期: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); }}
使用说明
系统使用步骤如下:
/averageGrade3
,可以看到每个科目的平均成绩文件。系统将处理多个科目成绩文件,每个文件对应一个科目,输出的文件名格式为“科目名_avg_score”。例如,math_avg_score将包含数学科目的平均成绩。
注意事项
在文件处理过程中,需要注意以下几点:
通过以上实现,您可以轻松地统计多个科目学生的平均成绩,适用于大规模数据处理场景。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年05月12日 03时08分15秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
listbox相互传值
2025-04-10
Listview 利用Datapager进行分页
2025-04-10
listview数据刷新后自动滑到底部
2025-04-10
list循环删除元素中的坑
2025-04-10
list深拷贝和浅拷贝
2025-04-10
List集合排序找出其中的最大和最小值
2025-04-11
List<String>用空串替换null值,并且都加上单引号,并且转为字符串用,分割
2025-04-11
liunx 下WebBench 安装与压力测试
2025-04-11
liunx-FTP服务器_无需整理
2025-04-11
Liunx挂载nfts盘数据方法
2025-04-11
liunx查找当前目录文件及子目录文件下的中文并替换
2025-04-11
liunx目录和文件管理(一)
2025-04-11
LiveData的分析与简单使用
2025-04-11
LiveGBS user/save 逻辑缺陷漏洞复现(CNVD-2023-72138)
2025-04-11
live和on的区别
2025-04-11
li下的ul----多级列表
2025-04-11
lk部分没有msm8937相关目录原因(指向msm8952)
2025-04-11
llm 从0开始学习大语言模型, transformer架构学习
2025-04-11