一、问题描述

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

数据格式如下:
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. MapReduce编程之求每个学生的最高成绩及对应科目(使用GroupingComparator和SortComparator)

    stuscore.csv 1,鸿飞,语文,84 2,鹏海,语文,85 3,铭晨,语文,86 4,霑千昌,语文,87 5,智宇,语文,88 6,景彰,语文,89 7,辰铭,语文,90 8,曜灿,语文,9 ...

  2. MapReduce编程之求每门科目的前三名(重写student类中的compareTo方法)

    stuscore.csv 1,鸿飞,语文,84 2,鹏海,语文,85 3,铭晨,语文,86 4,霑千昌,语文,87 5,智宇,语文,88 6,景彰,语文,89 7,辰铭,语文,90 8,曜灿,语文,9 ...

  3. 【赵强老师】MapReduce编程案例之求工资总额

    先看视频. [赵强老师]MapReduce编程案例之求工资总额 Hadoop MapReduce是一个软件框架,基于该框架能够容易地编写应用程序,这些应用程序能够运行在由上千个商用机器组成的大集群上, ...

  4. MapReducer——MapReduce编程案例:求部门的工资总额(2)

    MapReduce编程案例:求部门的工资总额 1.员工表  SQL:select deptno,sum(sal) from emp group by deptno; 2.分析数据处理的过程 3.开发程 ...

  5. 大数据之Hadoop学习——动手实战学习MapReduce编程实例

    文章目录 一.MapReduce理论基础 二.Hadoop.Spark学习路线及资源收纳 三.MapReduce编程实例 1.自定义对象序列化 需求分析 报错:Exception in thread ...

  6. mapreduce 编程模型

    MapReduce是在总结大量应用的共同特点的基础上抽象出来的分布式计算框架,它适用的应用场景往往具有一个共同的特点:任务可被分解成相互独立的子问题.基于该特点,MapReduce编程模型给出了其分布 ...

  7. 大数据之hadoop伪集群搭建与MapReduce编程入门

    一.理论知识预热 一句话介绍hadoop: Hadoop的核心由分布式文件系统HDFS与Map/Reduce计算模型组成. (1)HDFS分布式文件系统 HDFS由三个角色构成: 1)NameNode ...

  8. Hadoop大数据--Mapreduce编程规范及入门示例

    Mapreduce是一个分布式的运算编程框架,核心功能是将用户编写的核心逻辑代码分布式地运行在一个集群的很多服务器上. Mapreduce的存在价值 (1)海量数据在单机上处理因为硬件资源限制,无法胜 ...

  9. MapReduce编程实践

    一.MapReduce编程思想 学些MapRedcue主要是学习它的编程思想,在MR的编程模型中,主要思想是把对数据的运算流程分成map和reduce两个阶段: Map阶段:读取原始数据,形成key- ...

最新文章

  1. 二.Springboot 常用注解
  2. mysql优化sql相关(持续补充)
  3. 消息队列入门(三)JMS标准及实现
  4. 使用详解_Log4j2使用详解
  5. Linux下Zend Framework的“Invalid Controller Specified”问题
  6. 各j2ee web层框架比较(转)
  7. 使用API Monitor监测到目标程序对系统API函数的调用(常用分析工具)
  8. 2019年“深圳杯”数学建模挑战赛B题解题思路(一)
  9. 雅可比矩阵与海森矩阵
  10. 对软件系统进行验收测试,宁夏软件系统验收测试_找小赛
  11. Butterfly-蝴蝶-主题优化、美化-Lete乐特
  12. vscode 上使用 SDCC 工具链开发 8051(DHT11温湿度传感器示例)
  13. android 绘画笔迹回放_一种基于可缩放矢量图形的安卓平台笔迹回放方法及装置与流程...
  14. Flutter: 千位数加逗号分隔
  15. ROS中的TF坐标变换
  16. GroupDocs.Conversion Crack,强大 .NET 文档转换组件
  17. 网络教学系统毕业设计
  18. 手把手教你使用Python获取B站视频并在本地实现弹幕播放功能
  19. 运行office弹出stdole32
  20. 宝塔 无法自动认证,请填写本地服务器的登录信息!

热门文章

  1. Java基础 【Arrays 类的使用】
  2. P4878 道路修建-美国
  3. 平面单腿机器人跳跃控制研究——后续内容
  4. div+css 简单导航
  5. div+css 布局浏览器兼容
  6. Python学习笔记之类(二)
  7. spring事务浅析
  8. 记一次“Shiro+任务调度”开发过程中出现UnavailableSecurityManagerException解决思路
  9. Java中的PriorityQueue优先级队列
  10. ubuntu16.04 离线安装docker ce