一、问题描述

三个文件中分别存储了学生的语文、数学和英语成绩,输出每个学生的平均分。

数据格式如下: 
Chinese.txt

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

Math.txt

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

English.txt

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

二、MapReduce编程

package com.javacore.hadoop;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;
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;import java.io.IOException;/*** Created by bee on 3/29/17.*/
public class StudentAvgDouble {public static class MyMapper extends Mapper<Object, Text, Text, DoubleWritable> {public void map(Object key, Text value, Context context) throws IOException, InterruptedException {String eachline = value.toString();StringTokenizer tokenizer = new StringTokenizer(eachline, "\n");while (tokenizer.hasMoreElements()) {StringTokenizer tokenizerLine = new StringTokenizer(tokenizer.nextToken());String strName = tokenizerLine.nextToken();String strScore = tokenizerLine.nextToken();Text name = new Text(strName);IntWritable score = new IntWritable(Integer.parseInt(strScore));context.write(name, score);}}}public static class MyReducer extends Reducer<Text, DoubleWritable, Text, DoubleWritable> {public void reduce(Text key, Iterable<DoubleWritable> values, Contextcontext) throws IOException, InterruptedException {double sum = 0.0;int count = 0;for (DoubleWritable val : values) {sum += val.get();count++;}DoubleWritable avgScore = new DoubleWritable(sum / count);context.write(key, avgScore);}}public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {//删除output文件夹FileUtil.deleteDir("output");Configuration conf = new Configuration();String[] otherArgs = new String[]{"input/studentAvg", "output"};if (otherArgs.length != 2) {System.out.println("参数错误");System.exit(2);}Job job = Job.getInstance();job.setJarByClass(StudentAvgDouble.class);job.setMapperClass(MyMapper.class);job.setReducerClass(MyReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(DoubleWritable.class);FileInputFormat.addInputPath(job, new Path(otherArgs[0]));FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));System.exit(job.waitForCompletion(true) ? 0 : 1);}
}

三、StringTokenizer和Split的用法对比

map函数里按行读入,每行按空格切开,之前我采用的split()函数切分,代码如下。

 String eachline = value.toString();for (String eachline : lines) {System.out.println("eachline:\t"+eachline);String[] words = eachline.split("\\s+");Text name = new Text(words[0]);IntWritable score = new IntWritable(Integer.parseInt(words[1]));context.write(name, score);}

这种方式简单明了,但是也存在缺陷,对于非正常编码的空格有时候会出现切割失败的情况。 
StringTokenizer是java.util包中分割解析类,StringTokenizer类的构造函数有三个:

  1. StringTokenizer(String str):java默认的分隔符是“空格”、“制表符(‘\t’)”、“换行符(‘\n’)”、“回车符(‘\r’)。
  2. StringTokenizer(String str,String delim):可以构造一个用来解析str的StringTokenizer对象,并提供一个指定的分隔符。
  3. StringTokenizer(String str,String delim,boolean returnDelims):构造一个用来解析str的StringTokenizer对象,并提供一个指定的分隔符,同时,指定是否返回分隔符。

    StringTokenizer和Split都可以对字符串进行切分,StringTokenizer的性能更高一些,分隔符如果用到一些特殊字符,StringTokenizer的处理结果更好。

四、运行结果

张三  82.0
李四  90.0
王五  82.0
赵六  76.66666666666667

mapreduce求平均值相关推荐

  1. Hadoop入门(二十二)Mapreduce的求平均值程序

    一.简介 求平均值是统计中最常使用到的,现在使用Mapreduce在海量数据中统计数据的求平均值. 二.例子 (1)实例描述 给出三个文件,每个文件中都存储了若干个数值,求所有数值中的求平均值. 样例 ...

  2. 新手向,从用Spark求平均值到reduceByKey详解

    1.前因后果 在网上看到了一种用Spark求平均值的算法,自己写了下,修改了一些错误,我这是能直接run起来的版本.我会在本文中对这段代码进行详细的讲解,以加强对reduceByKey用法的印象.耐心 ...

  3. 对tf.reduce_mean API的理解就是求平均值,reduce指的是一串数据求平均值后维数降低了,可不是吗,一串向量变成了一个数,维数自然降低了

    tf.math.reduce_mean(input_tensor, axis=None, keepdims=False, name=None ) 对tf.reduce_mean的理解就是求平均值,re ...

  4. 看完微软大神写的求平均值代码,我意识到自己还是too young了

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 博雯 发自 凹非寺 量子位 | 公众号 QbitAI 取整求个无符号整数的平均值,居然 ...

  5. 微软大神“玩”出新花样,求平均值代码还能这样写?

    编译 | 马超       责编 | 苏宓 出品 | CSDN(ID:CSDNnews) 近日,微软神级人物Raymond Chen在个人博客上,发布了一篇关于<如何计算平均值>的博文.这 ...

  6. 1054. 求平均值 (20)

    1054. 求平均值 (20)本题的基本要求非常简单:给定N个实数,计算它们的平均值.但复杂的是有些输入数据可能是非法的.一个"合法"的输入是[-1000,1000]区间内的实数, ...

  7. 12-1054. 求平均值

    1054. 求平均值 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题的基本要求非常简单:给定N个实 ...

  8. 用函数求10个数的平均值_Excel AVERAGEIF函数条件求平均值

    AVERAGEIF 函数 说明:返回某个区域内满足给定条件的所有单元格的平均值(算术平均值) 语法:AVERAGEIF(range, criteria, [average_range]) 中文语法:A ...

  9. tensorflow随笔-求平均值的函数

    求平均值的函数 reduce_mean axis为1表示求行 axis为0表示求列 >>> xxx=tf.constant([[1., 10.],[3.,30.]]) >> ...

  10. 【Python】1054 求平均值(Python异常处理练习)

    1. 题目 2. 代码 重坑,读题不仔细,导致耗时多. 题目中合法数字当只用一个的时候,输出的结果中的是number,而不是numbers # https://pintia.cn/problem-se ...

最新文章

  1. 大数据flume日志采集系统详解
  2. 无人出租今起免费坐,只恨不是长沙人
  3. (转)我的座驾见谁灭谁!
  4. 【Flask】Jinja2之模板中使用url_for
  5. python处理字符_常用python字符串处理
  6. C++中使用TCP传文件
  7. Centos7.6环境Docker安装Oracle19c企业版
  8. Windows 10某个网络端口被占用怎么办?
  9. Ajax爬取今日头条街拍美女
  10. Django-admin源码流程
  11. 利用PowerShell复制SQLServer账户的所有权限
  12. google浏览器更新问题和路径问题
  13. VS2017社区版+OpenCV3.4.10配置
  14. 生物统计分析之主成分分析(PCA)
  15. speedoffice(Word)文字怎么添加下划线
  16. 如何设置word的有效期
  17. java汉诺塔5层攻略_史上最难智力游戏第5关汉诺塔图文通关攻略
  18. 51单片机|keilc51|模块函数|延时函数、独立键盘函数
  19. 交换机和集线器的区别是什么?
  20. 魔兽、星际、红警的经典对比

热门文章

  1. C64x+中断控制器
  2. Karen与测试 奇迹淫巧+快速幂
  3. 预测nba本赛季球队夺冠的胜率并进行相关分析
  4. 【转】前端开发设计必备的Chrome插件
  5. 转载:Gabor 特征总结
  6. WPS无法用backspace删除空白页怎么办?
  7. Latex 图注设置(图1:改为图1-1)
  8. 光伏行业MES管理系统解决方案
  9. matlab如何根据历年gdp找增长规律,中国历年GDP统计数据
  10. node - 收藏集 - 掘金