Mapreduce 求每个学科的平均分,学科作为行键,成绩作为列族,如何创建一个数组遍历成绩
时间: 2024-02-03 10:02:08 浏览: 66
在 MapReduce 中,输入数据通常以键值对的形式表示。对于本题,我们可以将学科作为键,成绩作为值,例如:
```
Mathematics 85
English 72
Mathematics 90
Science 78
English 83
```
为了计算每个学科的平均分,我们需要将相同学科的成绩累加起来,然后计算平均值。在 Mapper 阶段,我们可以将学科作为键,成绩作为值,输出键值对。在 Reducer 阶段,我们可以对相同学科的所有成绩进行累加,并计算平均值。
下面是一个简单的示例代码,假设输入数据已经按照学科排序:
```java
public static class AvgScoreMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
private Text subject = new Text();
private IntWritable score = new IntWritable();
@Override
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] parts = value.toString().split("\\s+");
subject.set(parts[0]);
score.set(Integer.parseInt(parts[1]));
context.write(subject, score);
}
}
public static class AvgScoreReducer extends Reducer<Text, IntWritable, Text, DoubleWritable> {
private DoubleWritable avgScore = new DoubleWritable();
@Override
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
int count = 0;
for (IntWritable value : values) {
sum += value.get();
count++;
}
double avg = (double) sum / count;
avgScore.set(avg);
context.write(key, avgScore);
}
}
```
在 Mapper 中,我们首先将输入数据按空格分割成数组,然后将数组的第一个元素作为学科,第二个元素作为成绩,将学科和成绩分别设置到 `Text` 和 `IntWritable` 对象中,并输出键值对。
在 Reducer 中,我们首先对相同学科的所有成绩进行累加,并记录成绩的个数。然后计算平均值,将学科和平均值分别设置到 `Text` 和 `DoubleWritable` 对象中,并输出键值对。
在以上示例代码中,并没有使用数组来遍历成绩。在 MapReduce 中,我们通常使用迭代器来遍历值的集合。在 Reducer 中,输入的值是一个 `Iterable` 对象,可以使用 `for` 循环遍历所有的成绩。在示例代码中,我们使用增强型 `for` 循环来遍历值的集合。
阅读全文