hadoop mapreduce求平均分

来源:互联网 发布:作家助手之类软件 编辑:程序博客网 时间:2024/04/29 17:47

求平均分的关键在于,利用mapreduce过程中,一个key聚合在一起,输送到一个reduce的特性。

假设三门课的成绩如下:

china.txt

张三    78李四    89王五    96赵六    67

english.txt

张三    80李四    82王五    84赵六    86

math.txt

张三88李四99王五66赵六72

mapreduce如下:

public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {            // 实现map函数        public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {            // 将输入的纯文本文件的数据转化成String            String line = value.toString();            // 将输入的数据首先按行进行分割            StringTokenizer tokenizerArticle = new StringTokenizer(line, "\n");            // 分别对每一行进行处理            while (tokenizerArticle.hasMoreElements()) {                // 每行按空格划分                StringTokenizer tokenizerLine = new StringTokenizer(tokenizerArticle.nextToken());                String strName = tokenizerLine.nextToken();// 学生姓名部分                String strScore = tokenizerLine.nextToken();// 成绩部分                Text name = new Text(strName);                int scoreInt = Integer.parseInt(strScore);                // 输出姓名和成绩                context.write(name, new IntWritable(scoreInt));            }        }    }        public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {        // 实现reduce函数        public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {            int sum = 0;            int count = 0;            Iterator<IntWritable> iterator = values.iterator();            while (iterator.hasNext()) {                sum += iterator.next().get();// 计算总分                count++;// 统计总的科目数            }            int average = (int) sum / count;// 计算平均成绩            context.write(key, new IntWritable(average));        }    }

输出如下:

张三82李四90王五82赵六75


原创粉丝点击