数据源:来自互联网招聘hadoop岗位的薪资数据,其中几行示例数据如下:

美团    3-5年经验   15-30k  北京    【够牛就来】hadoop高级工程...
北信源 3-5年经验 15-20k 北京 Java高级工程师(有Hadoo...
蘑菇街 3-5年经验 10-24k 杭州 hadoop开发工程师
晶赞科技 1-3年经验 10-30k 上海 hadoop研发工程师
秒针系统 3-5年经验 10-20k 北京 hadoop开发工程师
搜狐 1-3年经验 18-23k 北京 大数据平台开发工程师(Hadoo...
执御 1-3年经验 8-14k 杭州 hadoop工程师
KK唱响 3-5年经验 15-30k 杭州 高级hadoop开发工程师
晶赞科技 1-3年经验 12-30k 上海 高级数据分析师(hadoop)
亿玛在线(北京)科技有限公司 3-5年经验 18-30k 北京 hadoop工程师
酷讯 1-3年经验 10-20k 北京 hadoop Engineer/...
游族网络 5-10年经验 20-35k 上海 hadoop研发工程师
易车公司 3-5年经验 15-30k 北京 hadoop工程师
爱图购 1-3年经验 8-15k 杭州 hadoop开发工程师
晶赞科技 3-5年经验 15-33k 上海 hadoop研发工程师

功能需求:基于这份数据统计Hadoop工程师各工作年限段的薪资水平,输出如下:

1-3年经验    8-30k
3-5年经验 10-33k
5-10年经验 20-35k 
import java.io.IOException;
import java.util.regex.Pattern;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.LongWritable;
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 org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner; /**
* 基于样本数据做Hadoop工程师薪资统计:计算各工作年限段的薪水范围
*/
public class SalaryCount extends Configured implements Tool { public static class SalaryMapper extends Mapper< LongWritable, Text, Text, Text> {
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//红色自己编写
//示例数据:美团 3-5年经验 15-30k 北京 hadoop高级工程
String line = value.toString();//读取每行数据         String[] record = line.split( "\\s+");//使用空格正则解析数据
        //key=record[1]:输出3-5年经验
       //value=record[2]:15-30k
      //作为Mapper输出,发给 Reduce 端
        if(record.length >= 3){
        context.write( new Text(record[1]), new Text(record[2])
       );
    }
}
}
public static class SalaryReducer extends Reducer< Text, Text, Text, Text> {
public void reduce(Text Key, Iterable< Text> Values, Context context) throws IOException, InterruptedException { int low = 0;//记录最低工资
int high = 0;//记录最高工资
int count = 1;
//针对同一个工作年限(key),循环薪资集合(values),并拆分value值,统计出最低工资low和最高工资high
for (Text value : Values) {
    String[] arr = value.toString().split("-");
    int l = filterSalary(arr[0]);
    int h = filterSalary(arr[1]);
    if(count==1 || l< low){
     low = l;
    }
    if(count==1 || h>high){
     high = h;
     }
    count++;
      }
      context.write(Key, new Text(low + "-" +high + "k"));
  }
}
//正则表达式提取工资值
public static int filterSalary(String salary) {
String sal = Pattern.compile("[^0-9]").matcher(salary).replaceAll("");
return Integer.parseInt(sal);
} @Override
public int run(String[] args) throws Exception {
Configuration conf = new Configuration();//读取配置文件 Path out = new Path(args[1]);
FileSystem hdfs = out.getFileSystem(conf);
if (hdfs.isDirectory(out)) {//删除已经存在的输出目录
hdfs.delete(out, true);
} Job job = new Job(conf, "SalaryCount" );//新建一个任务
job.setJarByClass(SalaryCount.class);// 主类 FileInputFormat.addInputPath(job, new Path(args[0]));// 文件输入路径
FileOutputFormat.setOutputPath(job, new Path(args[1]));// 文件输出路径 job.setMapperClass(SalaryMapper.class);// Mapper
job.setReducerClass(SalaryReducer.class);// Reducer job.setOutputKeyClass(Text.class);//输出结果key类型
job.setOutputValueClass(Text.class);//输出结果的value类型 job.waitForCompletion(true);//等待完成退出作业 return 0;
} /**
* @param args 输入文件、输出路径,可在Eclipse中Run Configurations中配Arguments,如:
* hdfs://single.hadoop.dajiangtai.com:9000/junior/salary.txt
* hdfs://single.hadoop.dajiangtai.com:9000/junior/salary-out/
*/
public static void main(String[] args) throws Exception {
try {
int res = ToolRunner.run(new Configuration(), new SalaryCount(), args);
System.exit(res);
} catch (Exception e) {
e.printStackTrace();
}
}
}

总结,通过左右对比可看出,70%的代码几乎一样,重要的是修改map、reduce部分,以及run方法中的部分设置。好了,在你搭建好的Eclipse开发环境中跑一下这个程序看看结果吧。

自己的第一个MapReduce程序的更多相关文章

  1. 一起学Hadoop——使用IDEA编写第一个MapReduce程序(Java和Python)

    上一篇我们学习了MapReduce的原理,今天我们使用代码来加深对MapReduce原理的理解. wordcount是Hadoop入门的经典例子,我们也不能免俗,也使用这个例子作为学习Hadoop的第 ...

  2. HDFS设计思路,HDFS使用,查看集群状态,HDFS,HDFS上传文件,HDFS下载文件,yarn web管理界面信息查看,运行一个mapreduce程序,mapreduce的demo

    26 集群使用初步 HDFS的设计思路 l 设计思想 分而治之:将大文件.大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析: l 在大数据系统中作用: 为各类分布式 ...

  3. 编写自已的第一个MapReduce程序

    从进入系统学习到现在,貌似我们还没有真正开始动手写程序,估计有些立志成为Hadoop攻城狮的小伙伴们已经有些急了.环境已经搭好,小讲也有些按捺不住了.今天,小讲就和大家一起来动手编写我们的第一个Map ...

  4. 编写第一个MapReduce程序—— 统计气温

    摘要:hadoop安装完成后,像学习其他语言一样,要开始写一个“hello world!” ,看了一些学习资料,模仿写了个程序.对于一个C#程序员来说,写个java程序,并调用hadoop的包,并跑在 ...

  5. 从零开始学习Hadoop--第2章 第一个MapReduce程序

    1.Hadoop从头说 1.1 Google是一家做搜索的公司 做搜索是技术难度很高的活.首先要存储很多的数据,要把全球的大部分网页都抓下来,可想而知存储量有多大.然后,要能快速检索网页,用户输入几个 ...

  6. 第一个MapReduce程序——WordCount

    通常我们在学习一门语言的时候,写的第一个程序就是Hello World.而在学习Hadoop时,我们要写的第一个程序就是词频统计WordCount程序. 一.MapReduce简介 1.1 MapRe ...

  7. Hadoop学习之第一个MapReduce程序

    期望 通过这个mapreduce程序了解mapreduce程序执行的流程,着重从程序解执行的打印信息中提炼出有用信息. 执行前 程序代码 程序代码基本上是<hadoop权威指南>上原封不动 ...

  8. 运行第一个MapReduce程序,WordCount

    1.安装Eclipse 安装后如果无法启动重新配置Java路径(如果之前配置了Java) 2.下载安装eclipse的hadoop插件 注意版本对应,放到/uer/lib/eclipse/plugin ...

  9. 第一个MapReduce程序

    计算文件中每个单词的频数 wordcount 程序调用 wordmap 和 wordreduce 程序. import org.apache.hadoop.conf.Configuration; im ...

  10. Hadoop 6、第一个mapreduce程序 WordCount

    1.程序代码 Map: import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.h ...

随机推荐

  1. thinkphp 视频教程

    http://edu.51cto.com/lesson/id-28238.html thinkphp

  2. Sping 的 BeanFactory 容器

    Sping 的 BeanFactory 容器 这是一个最简单的容器,它主要的功能是为依赖注入 (DI) 提供支持,这个容器接口在 org.springframework.beans.factory.B ...

  3. Eclipse 内置浏览器

    Web 浏览器 Eclipse 系统内部自带了浏览器,该浏览器可以通过点击 Window 菜单并选择 Show View > Other,在弹出来的对话框的搜索栏中输入 "browse ...

  4. ios - 上下滚动的新闻

    #import <UIKit/UIKit.h> @interface ScrollUpDownView : UIView //设置 要现实的文字 @property(nonatomic, ...

  5. Notepad++ 64位 插件管理

    notepad++ 64bit 没有插件管理,如何添加呢? 1.访问https://github.com/bruderstein/nppPluginManager/releases,下载  Plugi ...

  6. JS探秘——那些你理解存在偏差的问题

    Javascript的连续赋值运算 var a = {n:1}; a.x = a = {n:2}; alert(a.x); // --> undefined 看 jQuery 源码 时发现的这种 ...

  7. 【BZOJ4247】挂饰 背包

    [BZOJ4247]挂饰 Description JOI君有N个装在手机上的挂饰,编号为1...N. JOI君可以将其中的一些装在手机上. JOI君的挂饰有一些与众不同——其中的一些挂饰附有可以挂其他 ...

  8. Selenium:常见web UI元素操作及API使用

    链接(link) <div> <p>链接 link</p> <a href="www.cnblogs.com/tankxiao">小 ...

  9. JavaWeb 三层框架

    1. MVC 设计模式 Model: JavaBean; View: Jsp; Controller: Servlet; 2. JavaWeb 三层框架 所谓三层是表述层(WEB 层), 业务逻辑层( ...

  10. JS基础知识简介

    使用js的三种方式 1.HTML标签内嵌js <button onclick="javascript:alert(真点啊)">有本事点我</button> ...