求每一科的平均成绩,map函数用数组for循环
时间: 2024-02-27 22:56:14 浏览: 84
C语言程序设计-有一个一维数组score,内放10个学生的成绩,用一个函数来求平均成绩;
5星 · 资源好评率100%
好的,以下是MapReduce求每一科平均成绩,Map函数使用数组和for循环的实现方式:
1. 首先,您需要准备好数据,数据格式可以参考上一个回答中的例子。
2. 接下来,您需要编写一个Mapper类来处理每一行数据。在Mapper类中,您需要将每一行数据转换为键值对的形式,其中键是学科,值是一个包含成绩和计数器的数组。具体来说,您可以使用StringTokenizer类或者正则表达式来解析每一行数据,并将学科作为键,成绩和计数器作为数组中的值。然后,使用for循环将数组中的每个元素作为Map输出的值。例如:
```java
public class AvgScoreMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
private Text subject = new Text();
private IntWritable score = new IntWritable();
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] fields = value.toString().split(",");
subject.set(fields[1]);
int[] scores = {Integer.parseInt(fields[2]), 1};
for (int i = 0; i < scores.length; i++) {
score.set(scores[i]);
context.write(subject, score);
}
}
}
```
3. 然后,您需要编写一个Combiner类来进行中间结果的合并。在Combiner类中,您需要将接收到的所有值进行合并,并计算每一科的总成绩和学生人数。最后,您可以将计算结果封装在一个数组中,并将数组作为输出值发送到Reducer阶段。例如:
```java
public class AvgScoreCombiner extends Reducer<Text, IntWritable, Text, IntArrayWritable> {
private IntArrayWritable scoreArray = new IntArrayWritable();
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++;
}
int[] scores = {sum, count};
scoreArray.set(scores);
context.write(key, scoreArray);
}
}
```
4. 最后,您需要编写一个Reducer类来计算每一科的平均成绩。在Reducer类中,您需要将接收到的所有数组进行合并,并计算每一科的总成绩和学生人数。最后,您可以计算每一科的平均成绩,并将它们作为键值对输出。例如:
```java
public class AvgScoreReducer extends Reducer<Text, IntArrayWritable, Text, DoubleWritable> {
private DoubleWritable avgScore = new DoubleWritable();
public void reduce(Text key, Iterable<IntArrayWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
int count = 0;
for (IntArrayWritable array : values) {
int[] scores = (int[]) array.toArray();
sum += scores[0];
count += scores[1];
}
double avg = (double) sum / count;
avgScore.set(avg);
context.write(key, avgScore);
}
}
```
5. 最后,您需要编写一个Driver类来配置和运行MapReduce作业。在Driver类中,您需要设置输入路径、输出路径、Mapper类、Combiner类、Reducer类等参数,并提交作业到Hadoop集群中运行。例如:
```java
public class AvgScoreDriver {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "Average Score");
job.setJarByClass(AvgScoreDriver.class);
job.setMapperClass(AvgScoreMapper.class);
job.setCombinerClass(AvgScoreCombiner.class);
job.setReducerClass(AvgScoreReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntArrayWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
```
需要注意的是,在本例中,我们使用了一个名为IntArrayWritable的自定义Writable类来保存成绩和计数器的数组。您需要根据自己的需求来决定是否需要使用自定义Writable类。
阅读全文