美文网首页
学生各科平均成绩报表

学生各科平均成绩报表

作者: 徐嘉迪 | 来源:发表于2022-01-09 19:03 被阅读0次

    题干:

    编写三个类,一个 map类,一个reduce类,一个mian方法类。

    一、map类

    二、reduce

    三、mian

    四、结果

    以下是书本上的方法:

    package com.mapreducer;

    //8.学生各科平均成绩报表

    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.IntWritable;

    import org.apache.hadoop.io.LongWritable;

    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.lib.input.FileInputFormat;

    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

    //测试主类

    public class TestMapReducer08 {

    public static void main(String[] args) throws Exception {

      // 获取作业对象

      Job job = Job.getInstance(new Configuration());

      // 设置主类

      job.setJarByClass(TestMapReducer08.class);

      // 设置job参数

      job.setMapperClass(AvgScoreMapper08.class);

      job.setReducerClass(AvgScoreReducer08.class);

      job.setOutputKeyClass(Text.class);

      job.setOutputValueClass(IntWritable.class);

      // 设置job输入输出

    FileInputFormat.addInputPath(job, new Path("file:///usr/source08.txt"));

    FileOutputFormat.setOutputPath(job, new Path("file:///usr/output08"));

    System.exit(job.waitForCompletion(true) ? 0 : 1);

    }

    }

    // 让类AvgScoreMapper08继承类Mapper同时指定需要的参数类型,修改map类的内容

    class AvgScoreMapper08 extends Mapper<LongWritable, Text, Text, IntWritable> {

    @Override

    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

    // 读取—行数据

    String val = value.toString();// 把读取的数据以换行作为分割符

    StringTokenizer stringTokenizer = new StringTokenizer(val, "\n");

    while (stringTokenizer.hasMoreElements()) {

    StringTokenizer tmp = new StringTokenizer(stringTokenizer.nextToken());

    // 对读取的一行的名称和成绩进行切分并写入到context对象中

    String username = tmp.nextToken();

    String score = tmp.nextToken();

    context.write(new Text(username), new IntWritable(Integer.valueOf(score)));

    }

    }

    }

    // 让类AvgScoreReducer08继承类Reducer同时指定需要的参数类型,修改reducer类的内容

    class AvgScoreReducer08 extends Reducer<Text, IntWritable, Text, IntWritable> {

    @Override

    protected void reduce(Text key, Iterable<IntWritable> values, Context context)

    throws IOException, InterruptedException {

    // 获取对键值集合遍历对象

    Iterator<IntWritable> Iterator = values.iterator();

    int count = 0;

    int sum = 0;

    // 循环获取相同键的所有值并计算和

    while (Iterator.hasNext()) {

    int v = Iterator.next().get();

    sum += v;

    count++;

    }

    int avg = sum / count;

    context.write(key, new IntWritable(avg));

    }

    }

    最后还是建议使用第1种方法꒰๑'ꀾ'๑꒱

    相关文章

      网友评论

          本文标题:学生各科平均成绩报表

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