MapReduce案例2——求学生平均成绩

该博客介绍了如何运用MapReduce解决求学生平均成绩的问题,通过将姓名作为key,成绩作为value进行数据分组,然后在reduce阶段计算平均值,实现了类似SQL中按姓名分组求平均分的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

计算学生考试平均成绩 源数据:
张三 98
李四 96
王五 95
张三 90
李四 92
王五 99
张三 80
李四 90
王五 94
张三 82
李四 92

最终答案:
张三		98
李四		87
王五		86
上面的答案仅是格式,非正确数据

思路:姓名作为key,成绩作为value,在map分组,在reduce中求平均值

类似于SQL中的select name, avg(score) from studentscore group by name;

代码:

/**
 * @author: lpj   
 * @date: 2018年3月16日 下午7:16:47
 * @Description:
 */
package lpj.reduceWork;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
 *
 */
public class AverageSocr
### 使用Hadoop MapReduce实现学生成绩分析 #### 数据准备 为了使用Hadoop MapReduce进行成绩分析,首先需要准备好输入文件。假设每条记录表示一个学生的单科成绩,格式如下: ``` student_id,subject,score 1001,Mathematics,85 1002,English,90 ... ``` 这些数据会被存储在一个或多个文本文件中,并放置于HDFS之上。 #### 编写Mapper函数 Mapper负责读取输入并将其转换成键值对的形式。对于本案例而言,可以按照学科作为Key来划分数据,在此阶段并不计算具体的分数统计量而是简单地传递原始得分给Reducer处理[^1]。 ```java public class ScoreAnalysisMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable score = new IntWritable(); private Text subject = new Text(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String[] columns = value.toString().split(","); if (columns.length != 3 || !isNumeric(columns[2])) return; subject.set(columns[1]); score.set(Integer.parseInt(columns[2])); context.write(subject, score); } boolean isNumeric(String strNum) { try { Integer.parseInt(strNum); } catch(NumberFormatException nfe){ return false; } return true; } } ``` #### 编写Reducer函数 Reducer接收来自同一Key的所有Value列表,并执行必要的聚合操作以得出最终的结果——即各门课程的平均分。这里需要注意的是,由于MapReduce模型的特点决定了同一个Key对应的数据会集中到一起由单一实例完成汇总工作,因此可以直接在此基础上累加总分以及计数以便后续除法运算得到均值[^2]。 ```java public class ScoreAnalysisReducer extends Reducer<Text, IntWritable, Text, FloatWritable> { @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; int count = 0; for (IntWritable val : values) { sum += val.get(); ++count; } float averageScore = ((float)sum)/count; // 计算平均分 context.write(key, new FloatWritable(averageScore)); } } ``` 上述代码展示了如何基于Hadoop MapReduce架构设计程序逻辑来进行简单的教育领域内成绩统计数据挖掘任务。通过这种方式不仅可以有效地应对大规模数据集带来的挑战,同时也为更复杂的业务需提供了坚实的技术基础。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值