MapReduce—平均工资

  • MapReduce—平均工资
    • 1. 需求分析
    • 2. 解答思路
MapReduce—平均工资
我这里是使用集群去处理这个日志数据,数据在我的github上,默认使用maven去管理所有的jar包
  • github地址
1. 需求分析

按照所给数据文件去统计每个部门的人数,最高工资,最低工资和平均工资

需求统计的日志数据如下:

需要将每个部门的人数,工资进行统计。比如10号部门有3个人,最高工资是5000元,最低工资是1300元,平均工资是2916.666666666667元。则以如下形式进行显示:

10 3 5000 1300 2916.666666666667

2. 解答思路

1.因为要统计部门的人数以及工资,那么在最后的reduce阶段,进行汇总时,可以设置一个计数器,在进行汇总时,就可以计算出部门人数,所以,我们只需要日志数据中的两列,分别是部门编号和工资,将部门编号作为key,工资作为value2.在reduce输出阶段,因为要输出人数,最高工资,最低工资和平均工资,一共四列,所以需要将计算出的结果拼接成一个Text进行输出3.在处理过程中我使用Partitioner将数据分开通过不同的reduce去处理4.如果需要本地运行,记得注释掉avgsal文件中的23/24/25行,并将47行和50行的文件路径修改为自己所使用的文件路径5.因为在数据扭转的过程中,<K2, V2>和<K3, V3>的数据类型发生了变化,所以要在avgsal中设置map端所输出的数据类型,也就是要指定<K2, V2>的数据类型

mapper端代码

package com.yangqi.avgsal;import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;/*** @author xiaoer* @date 2019/11/12 12:44*/
public class MyMapper extends Mapper<LongWritable, Text, IntWritable, DoubleWritable> {IntWritable num = new IntWritable();DoubleWritable result = new DoubleWritable();/*** 针对每一行的数据,都会执行一次下面的map方法** @param key* @param value* @param context* @throws IOException* @throws InterruptedException*/@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String line = value.toString();String[] split = line.split(",");String str1 = split[split.length - 1];String str2 = split[split.length - 3];num.set(Integer.parseInt(str1));result.set(Double.parseDouble(str2));context.write(num, result);}
}

reduce端代码

package com.yangqi.avgsal;import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;/*** @author xiaoer* @date 2019/11/12 12:47*/
public class MyReducer extends Reducer<IntWritable, DoubleWritable, IntWritable, Text> {Text result = new Text();@Overrideprotected void reduce(IntWritable key, Iterable<DoubleWritable> values, Context context) throws IOException, InterruptedException {// 记录部门的人数int num = 0;// 记录部门的工资和double sum = 0;// 记录最大工资double max = Double.MIN_VALUE;// 记录最小工资double min = Double.MAX_VALUE;for (DoubleWritable value : values) {num++;sum += value.get();if (max < value.get()) {max = value.get();}if (min > value.get()) {min = value.get();}}// 将结果进行拼接,拼接成Text进行输出String str = "\t" + num + "" + "\t" + max + "" + "\t" + min + "\t" + (sum / num);result.set(str);// 以<K3, V3>形式进行写出context.write(key, result);}
}

partitioner端代码

package com.yangqi.avgsal;import org.apache.hadoop.mapreduce.Partitioner;/*** @author xiaoer* @date 2019/11/13 11:54*/
public class MyPartitioner<K, V> extends Partitioner<K, V> {public int getPartition(K key, V value, int numPartitions) {int emp = Integer.parseInt(key.toString());if (emp == 10 || emp == 30) {return 0;} elsereturn 1;}
}

avgsal

package com.yangqi.avgsal;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import java.io.IOException;/*** @author xiaoer* @date 2019/11/12 12:50*/
public class AvgSal {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {// 获取配置对象:读取四个默认配置文件Configuration conf = new Configuration();System.setProperty("HADOOP_USER_NAME", "hadoop");conf.set("mapreduce.app-submission.cross-platform", "true");conf.set("mapred.jar", "AvgSal/target/AvgSal-1.0-SNAPSHOT.jar");FileSystem fs = FileSystem.get(conf);// 创建Job实例对象Job job = Job.getInstance(conf, "avgsal");// 用于指定驱动类型job.setJarByClass(AvgSal.class);// 用于指定Map阶段的类型job.setMapperClass(MyMapper.class);// 用于指定Reduce阶段的类型job.setReducerClass(MyReducer.class);job.setNumReduceTasks(2);// 设置Partition的类型job.setPartitionerClass(MyPartitioner.class);job.setMapOutputKeyClass(IntWritable.class);job.setMapOutputValueClass(DoubleWritable.class);// 设置K3的输出类型job.setOutputKeyClass(IntWritable.class);// 设置V3的输出类型job.setOutputValueClass(Text.class);// 设置要统计的文件的路径FileInputFormat.addInputPath(job, new Path("/emp"));// FileInputFormat.addInputPath(job, new Path(args[0]));// 设置文件的输出路径Path path = new Path("/output");// Path path = new Path(args[1]);if (fs.exists(path)) {fs.delete(path, true);}FileOutputFormat.setOutputPath(job, path);// 等到作业执行,并退出System.exit(job.waitForCompletion(true) ? 0 : 1);}
}

MapReduce—平均工资相关推荐

  1. SQL-54 查找排除当前最大、最小salary之后的员工的平均工资avg_salary。

    题目描述 查找排除当前最大.最小salary之后的员工的平均工资avg_salary. CREATE TABLE `salaries` ( `emp_no` int(11) NOT NULL, `sa ...

  2. 查询出每个部门比本部门平均工资高的职工人数

    这句话,我裂开了. 部门表dept如下: 员工表emp如下: 我感觉有两种理解. 1.找出部门内,工资高于平均工资的员工数 with temp(avg_sal,deptno) as (select a ...

  3. 2019宁波本科计算机招聘工资,@宁波人,76282!2019年度平均工资是这么多,你拖后腿了吗?...

    原标题:@宁波人,76282!2019年度平均工资是这么多,你拖后腿了吗? 今天,宁波市统计局发布2019年宁波市平均工资, 我市全社会单位就业人员年平均工资76282元,高于全省4759元.一起来看 ...

  4. 2020年2月全国程序员工资统计,平均工资13716元,你被平均了吗?

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 来自| CSDN   作者 | 有数可据 https://blog.csdn.ne ...

  5. 2021年6月程序员平均工资 15052,你给行业拖后腿了吗?

    上周我们发布了一篇名为<2021年6月程序员工资统计,平均15052元>的文章,引起了网友们的广泛讨论. 据文章中调查结果显示,"2021年6月全国招收程序员435501人,平均 ...

  6. 程序员真香!IT 业 2020 年平均工资最高

    整理 | 王晓曼 出品 | 程序人生 (ID:coder _life) 5月19日,国家统计局发布2020年平均工资数据,随后,相关话题便冲上微博热搜. 程序员真香! 据国家统计局发布的数据显示,20 ...

  7. SQL-16 统计出当前各个title类型对应的员工当前薪水对应的平均工资。结果给出title以及平均工资avg。...

    题目描述 统计出当前各个title类型对应的员工当前薪水对应的平均工资.结果给出title以及平均工资avg. CREATE TABLE `salaries` ( `emp_no` int(11) N ...

  8. 7月平均工资下来,Java程序员哭笑不得!

    2020 魔幻开局,不少企业开始缩减招聘名额,更别说涨薪了!据第三方统计,今年 7 月程序员平均工资为 14357 元.作为第一编程语言的 Java,平均工资 14448 元(6 月为 14433 元 ...

  9. python平均工资-2019年我国程序员薪资统计,看看你出于什么水平?

    主要城市程序员工资 2019年9月北京招收程序员26430人.2019年9月北京程序员平均工资17224元,工资中位数15000元,其中95%的人的工资介于3750元到45000元. 2019年9月上 ...

  10. python平均工资-2020 10大薪资最高的IT编程语言排名

    坊间流传一句俗语: 三百六十行,行行转IT. IT行业自2016年首次超过金融行业以后,一直到现在每年都是稳居高薪第1名的宝座. 本文盘点了2020 10大薪资最高的IT编程语言排名,看看是哪些编码技 ...

最新文章

  1. java类的注释模板_IDEA添加Java类注释模版的方法
  2. 数据中心100G主流应用技术分析与市场预测
  3. HighNewTech:支付宝全球首发5G手机,四大逆天功能(防骗三折叠气味识别自由飞)!
  4. WIN32开发:如何获取父进程的ID
  5. 简述python程序执行原理_Python程序的执行原理(1)
  6. linux 后端的进程,linux后台启动进程
  7. rest api如何创建_REST:创建资源
  8. 微服务学习之Gateway服务网关【Hoxton.SR1版】
  9. java 判断是否为车牌_java车牌检测识别库
  10. java面试题(分布式篇)
  11. photoshop Mac版本安装
  12. 基于融云直播 SDK,快速实现连麦布局(内附代码)
  13. Echarts3柱状图切换折线图时发生位移
  14. 两种方法模仿支付宝进入到后台界面模糊
  15. python中找不到模块_安装完Python包然后找不到模块的解决步骤
  16. 仿真 steam linux 安装教程,Ubuntu安装Steam游戏平台的解决方案
  17. 8421码到5421码的转换_8421BD码转换成5421BCD码.doc
  18. python格式化输出
  19. AI 作图绘画的软件和网址
  20. [开心幽默]一对北京情侣是如何吵架的 !(暴笑)

热门文章

  1. Unity布料系统 (Cloth)
  2. 学Java开源项目austin要多久?
  3. springboot项目启动过程中碰到的问题
  4. 营销型网站如何建设更完善
  5. 企业邮箱使用python发邮件
  6. mysql容器 kubernetes_Kubernetes创建mysql容器 互联网技术圈 互联网技术圈
  7. android无法连接到相机,Android应用开发之无法连接相机怎么解决?
  8. 你知道到底什么才是 Valhalla 项目么?
  9. cesium添加环形扩散波纹
  10. 联想拯救者电脑和华为matepad多屏协同解决“驱动版本过低”的问题