输入文件为学生成绩信息,包含了必修课与选修课成绩,格式如下: 班级1, 姓名1, 科目1, 必修, 成绩1 <br> (注:<br> 为换行符) 班级2, 姓名2, 科目1, 必修, 成绩2 <br> 班级1, 姓名1, 科目2, 选修,成绩3 <br> ………., ………, ………, ……… <br> 编写两个Hadoop平台上的MapReduce程序,分别实现如下功能: 1. 计算每个学生必修课的平均成绩。 2. 按科目统计每个班的平均成绩。
时间: 2024-01-18 11:03:47 浏览: 69
学生成绩管理系统
好的,针对您提供的成绩信息,我可以给您提供以下 MapReduce 程序实现两个功能:
1. 计算每个学生必修课的平均成绩
Mapper 类如下:
```java
public class AvgScoreByStudentMapper extends Mapper<LongWritable, Text, Text, FloatWritable> {
private Text outKey = new Text();
private FloatWritable outValue = new FloatWritable();
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// 将输入的文本内容按逗号分割
String[] data = value.toString().split(",");
// 只处理必修课成绩
if (data[3].trim().equals("必修")) {
String name = data[1].trim();
float score = Float.parseFloat(data[4].trim());
// 将学生姓名作为 key,成绩作为 value 输出
outKey.set(name);
outValue.set(score);
context.write(outKey, outValue);
}
}
}
```
Reducer 类如下:
```java
public class AvgScoreByStudentReducer extends Reducer<Text, FloatWritable, Text, FloatWritable> {
private FloatWritable outValue = new FloatWritable();
@Override
protected void reduce(Text key, Iterable<FloatWritable> values, Context context) throws IOException, InterruptedException {
float sum = 0;
int count = 0;
// 计算每个学生的成绩总和
for (FloatWritable value : values) {
sum += value.get();
count++;
}
// 计算平均成绩并输出
float avg = sum / count;
outValue.set(avg);
context.write(key, outValue);
}
}
```
2. 按科目统计每个班的平均成绩
Mapper 类如下:
```java
public class AvgScoreBySubjectMapper extends Mapper<LongWritable, Text, Text, FloatWritable> {
private Text outKey = new Text();
private FloatWritable outValue = new FloatWritable();
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// 将输入的文本内容按逗号分割
String[] data = value.toString().split(",");
String subject = data[2].trim();
float score = Float.parseFloat(data[4].trim());
// 将科目和班级组合作为 key,成绩作为 value 输出
outKey.set(subject + "-" + data[0].trim());
outValue.set(score);
context.write(outKey, outValue);
}
}
```
Reducer 类如下:
```java
public class AvgScoreBySubjectReducer extends Reducer<Text, FloatWritable, Text, FloatWritable> {
private FloatWritable outValue = new FloatWritable();
@Override
protected void reduce(Text key, Iterable<FloatWritable> values, Context context) throws IOException, InterruptedException {
float sum = 0;
int count = 0;
// 计算每个班级每个科目的成绩总和
for (FloatWritable value : values) {
sum += value.get();
count++;
}
// 计算平均成绩并输出
float avg = sum / count;
outValue.set(avg);
context.write(key, outValue);
}
}
```
以上代码仅供参考,具体实现还需要根据实际情况进行调整。
阅读全文