美文网首页
MapReduce编程实例(一)-求平均数

MapReduce编程实例(一)-求平均数

作者: Mr_K_ | 来源:发表于2019-12-26 15:45 被阅读0次

本文章为了整理一下上课老师教授的MapReduce例子。
MapReduce编程实例(一)-求平均数


现在有一个文件,里面记录了全校所有学生各科成绩,求每个学生的平均成绩,格式如下:
小明 语文 92
小明 数学 88
小明 英语 90
小强 语文 76
小强 数学 66
小强 英语 80
小木 语文 60
小木 数学 65
小木 英语 61


解决思路:
Map阶段先将数据拆成key:姓名,value:课程_成绩的格式提供给reduce,默认的partitioner会将名字相同的学生发到同一个reduce上面,这样reduce可以根据总分/科目数计算平均成绩。


头文件:

import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;
import org.apache.Hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.FloatWritable;
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.Reducer.Context;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

其他部分代码:

public class Average {
 public static class AverMapper extends Mapper<Object, Text, Text, Text> {
  @Override
  protected void map(Object key, Text value, Context context)
    throws IOException, InterruptedException {
   String line = value.toString();
   StringTokenizer stringTokenizer = new StringTokenizer(line, "\n");
   String name = "";
   StringBuffer out = new StringBuffer(32);
   while (stringTokenizer.hasMoreElements()) {
    String tmp = stringTokenizer.nextToken();
    StringTokenizer st = new StringTokenizer(tmp);
    while (st.hasMoreElements()) {
     name = st.nextToken();
     out.append(st.nextToken());
     out.append("_");
     out.append(st.nextToken());
     // 使用默认的hash partitioner将名字相同的同学发到一个reduce上
     context.write(new Text(name), new Text(out.toString()));
    }
   }
  }
 }
 public static class AverReducer extends
   Reducer<Text, Text, Text, FloatWritable> {
  @Override
  protected void reduce(Text key, Iterable<Text> values, Context context)
    throws IOException, InterruptedException {
   Iterator<Text> it = values.iterator();
   //计算每个key对应的记录条数和总分数
   int count = 0;
   int sum = 0;
   while (it.hasNext()) {
    String value = it.next().toString();
    String[] strs = value.split("\\_");
    if (strs.leng th < 2) {
     continue;
    }
    try {
     sum += Integer.parseInt(strs[1]);
    } catch (Exception e) {
     System.err.println(e.getMessage());
    }
    count++;
   }
   FloatWritable average = new FloatWritable(sum / count);
   context.write(key, average);
  }
 }
 public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
  System.out.println("Begin.....");
  Configuration conf =new Configuration();
  String[] arguments=new GenericOptionsParser(conf, args).getRemainingArgs();
  if(arguments.length<2){
   System.out.println("Usage:com.test.mr2.Average in out");
   System.exit(1);
  }
  Job job=new Job(conf,"Average");
  job.setJarByClass(Average.class);
  job.setMapperClass(AverMapper.class);
  job.setReducerClass(AverReducer.class);
  job.setMapOutputValueClass(Text.class);
  job.setMapOutputKeyClass(Text.class);
  job.setOutputKeyClass(Text.class);
  job.setOutputValueClass(FloatWritable.class);
  FileInputFormat.addInputPath(job, new Path(arguments[0]));
  FileOutputFormat.setOutputPath(job, new Path(arguments[1]));
  System.exit(job.waitForCompletion(true)?0:1);
  System.out.println("End.....");
 }
}


结果如下


计算学生课程平均成绩(某学生总分/课程数)

  • 输入格式
  • 小明 语文 92
  • 小明 数学 88
  • 小明 英语 90
  • 小强 语文 76
  • 小强 数学 66
  • 小强 英语 80
  • 小木 语文 60
  • 小木 数学 65
  • 小木 英语 61
  • 输出:
  • 小明 90
  • 小强 74
  • 小木 62
    */

相关文章

网友评论

      本文标题:MapReduce编程实例(一)-求平均数

      本文链接:https://www.haomeiwen.com/subject/cvfloctx.html