利用MapReduce计算学生的平均成绩--(附例子)

本文介绍了一种使用MapReduce框架来计算学生平均成绩的方法。具体步骤包括:Mapper阶段将学生姓名与成绩作为键值对输出,Reduce阶段则汇总每个学生的成绩并计算平均值。

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

要求:利用MapReduce计算学生的平均成绩???

分析:

   Mapper阶段
           将学生的name和grade成绩context.write(name,grade),
               实现<k1,v1>--->  <k2,v2>的转换;

   Reduce阶段
           计算每个学生的平均成绩;【这个阶段实现了<name,[g1,g2,g3..】>,对k2已经进行分区和排序了;
   

代码阶段:如下
          1.Mapper.class
  

public class MyAvgMapper extends Mapper<LongWritable,Text,Text,IntWritable>{
    private Text name=new Text();              //全局变量
    private IntWritable grade=new IntWritable();
	@Override
	protected void map(LongWritable key, Text value, Context context)
			throws IOException, InterruptedException {
	 
		StringTokenizer line=new StringTokenizer(value.toString());
		while(line.hasMoreTokens()){
			String _name=line.nextToken();
			String _grade=line.nextToken();
			/*IntWritable cj=new IntWritable(Integer.parseInt(fs));
             *context.write(new Text(name), cj);
             */
			grade.set(Integer.parseInt(_grade));
			name.set(_name);
			context.write(name, grade); //实现拆分
		}
	}
}

      StringTokenizer是用来拆分字符串的类;
        StringTokenizer("字符串" ,"分隔符"):构造函数的参数第一个是拆分的字符串,第二个是分隔的字符,不写的话,默认用空格拆分。

       

 2.Reduce.class

public class MyAvgReduce extends Reducer<Text,IntWritable,Text,IntWritable> {
	private IntWritable avggrade=new IntWritable();
	private int sum=0;
	private int count=0;
	@Override
	protected void reduce(Text key, Iterable<IntWritable> values, Context context)
			throws IOException, InterruptedException {
		 for(IntWritable grade:values){
			 sum+=grade.get();
			 count++;
		 }
		 avggrade.set(sum/count);  //计算平均值
		 context.write(key, avggrade); //写入输出的结果
	}
}

3.Driver.class

public class MyAvgDriver {
	public static void main(String[] args) throws IllegalArgumentException, IOException, ClassNotFoundException, InterruptedException {
		Configuration conf = new Configuration();
		 Path  outfile=new Path("file:///D:/Out_Data");
		 FileSystem fs=outfile.getFileSystem(conf);
		 if(fs.exists(outfile)){
			 fs.delete(outfile,true);
		 }
		 
	    Job job = Job.getInstance(conf);		  
		job.setJarByClass(MyAvgDriver.class);
		job.setJobName("mysort");
		job.setMapperClass(MyAvgMapper.class);//输入数据方法
		job.setReducerClass(MyAvgReduce.class);//计算结果
		
		job.setOutputKeyClass(Text.class);
	    job.setOutputValueClass(IntWritable.class);
		 
		FileInputFormat.addInputPath(job, new Path("file:///D:/测试数据/平均成绩"));
		FileOutputFormat.setOutputPath(job,outfile);
	 
		System.exit(job.waitForCompletion(true) ? 0 : 1);
		//线程各个方法 封装每个方法到该类
	}
}

4.输出结果

lisi	90
wangwu	86
zhangsan	84
zhaoliu	82

 

以上就是就是实现计算平均成绩的一段简单代码!!!望采纳!!






 

                                   

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值