对招聘数据处理分析并可视化

目录

  • 前言
  • 一、数据源和任务目标
  • 二、具体实现
    • 任务1.各学历平均工资
    • 任务2.各城市平均工资走势
    • 任务3.各岗位招聘数量占比分析
  • 总结

前言

关于本次任务:

当我们择业,寻找工作时,需要从各大招聘平台,招聘网站以及招聘单位官网等获取招聘信息,那么对相关数据进行分析,能帮助我们更好的了解招聘市场情况,可以对我们的就业提供参考。本次任务从Boss直聘获取数据,分析热门职位,城市平均工资等信息,帮助我们更好地面对严峻的就业形势。


以下是本次任务主要内容:

一、数据源和任务目标

数据来源于Boss直聘,一共1651条记录,其中包含id,city(城市),education(学历),salary(工资)等12个属性,数据样式如下:

任务目标:
1.各学历平均工资;
2.各城市平均工资走势;
3.各岗位招聘数量占比分析

二、具体实现

任务1.各学历平均工资

涉及数据属性:education, salary
任务输入:data.txt
任务输出:output/01/part-r-00000
总体流程设计如图:

数据处理:
Map部分

public static class Map extends Mapper<LongWritable, Text, Text, Text> {Text k = new Text();Text v = new Text();protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String s = value.toString();if (!s.contains("advantage") && s.trim().length() > 0 && s.split("\t").length == 12) {String[] strings = s.split("\t");k.set(strings[3]);v.set(strings[8]);context.write(k, v);}}}

Reduce部分

 public static class Reduce extends Reducer<Text, Text, Text, Text> {Text v = new Text();protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {Double sumSalary = 0D;int cntSalary = 0;for (Text value : values) {int salary = Integer.parseInt(value.toString());sumSalary += salary;cntSalary ++;}double avgSalary = sumSalary / cntSalary;v.set(avgSalary+"");context.write(key, v);}}

可视化:

def drawChart_1():root = "output/01/part-r-00000"date = []cases = []with open(root, 'r',encoding='utf-8') as f:while True:line = f.readline()if not line:   breakstrings = line.split('\t')date.append(str(strings[0]))cases.append(int(float(strings[1])))d = (Bar().add_xaxis(date).add_yaxis("平均工资", cases, stack="stack1").set_series_opts(label_opts=opts.LabelOpts(is_show=False)).set_global_opts(title_opts=opts.TitleOpts(title="各学历平均工资")).render("output_html/result1.html"))

运行结果:


通过数据分析以及观察可视化效果,各学历层次工资金额都很可观,博士生尤为显著,除此以外,大专,本科,硕士三个学历层次工资金额随学历层次的升高而增加。而对于其他层次,例如自考,培训,自学等,其工资水平也并不低,同时在一定程度上反映技术水平的重要性。但从整体来看,正常情况下,学历层次同工资水平是呈正比关系的,同时也反映当下考研热潮的火爆。

任务2.各城市平均工资走势

涉及数据属性:city, salary
任务输入:data.txt
任务输出:output/02/part-r-00000
总体流程设计如图:

数据处理:
Map部分

public static class Map extends Mapper<LongWritable, Text, Text, Text> {Text k = new Text();Text v = new Text();protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String s = value.toString();if (!s.contains("advantage") && s.trim().length() > 0 && s.split("\t").length == 12) {String[] strings = s.split("\t");k.set(strings[2]);v.set(strings[8]);context.write(k, v);}}}

Reduce部分

public static class Reduce extends Reducer<Text, Text, Text, Text> {Text v = new Text();protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {Double sumSalary = 0D;int cntSalary = 0;for (Text value : values) {int salary = Integer.parseInt(value.toString());sumSalary += salary;cntSalary ++;}double avgSalary = sumSalary / cntSalary;v.set(avgSalary+"");context.write(key, v);}}

可视化:

def drawChart_2():root = "output/02/part-r-00000"date = []cases = []with open(root, 'r',encoding='utf-8') as f:while True:line = f.readline()if not line: breakstrings = line.split('\t')date.append(str(strings[0]))cases.append(int(float(strings[1])))(Line(init_opts=opts.InitOpts(width="1600px", height="800px")).add_xaxis(xaxis_data=date).add_yaxis(series_name="工资",y_axis=cases,markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max", name="最大值")]),markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average", name="平均值")]),).set_global_opts(title_opts=opts.TitleOpts(title="各城市平均工资走势", subtitle=""),tooltip_opts=opts.TooltipOpts(trigger="axis"),toolbox_opts=opts.ToolboxOpts(is_show=True),xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False),).render("output_html/result2.html"))

运行结果:


通过数据分析以及观察可视化效果,在各大热门城市中,热门去向依然是北京,上海,广州,深圳(北上广深),工资水平居于第一梯队,是大家争先恐后去发展的地方。除此以外,杭州的平均工资水平也很可观,只是该城市对应届生身份卡得严,更多的是有工作经验的“社会人”在发展,所以很多应届毕业生选择去了工资水平相当的其他热门城市。近年,有很多新一线城市兴起,比如涉及到的南京,成都,武汉,重庆等,其平均工资水平虽然赶不上其他热门地域城市,但对于不少对工资水平要求不是太高,喜欢稍慢一点节奏生活的毕业生也是不错去向。总体来看,除北京,上海,广州,深圳,杭州这些热门城市工资水平在高薪标准以上,其他城市均在其之下。

任务3.各岗位招聘数量占比分析

涉及数据属性:position_name
任务输入:data.txt
任务输出:output/03/part-r-00000
总体流程设计如图:

数据处理:
Map部分

public static class Map extends Mapper<LongWritable, Text, Text, Text> {Text k = new Text();Text v = new Text();protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String s = value.toString();if (!s.contains("advantage") && s.trim().length() > 0 && s.split("\t").length == 12) {String[] strings = s.split("\t");k.set(strings[7]);v.set("1");context.write(k, v);}}}

Reduce部分

public static class Reduce extends Reducer<Text, Text, Text, Text> {Text v = new Text();protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {int size = Lists.newArrayList(values).size();v.set(size+"");context.write(key, v);}}

可视化:

def drawChart_3():root = "output/03/part-r-00000"values = []with open(root, 'r',encoding='utf-8') as f:while True:line = f.readline()if not line:                           breakstrings = line.split('\t')values.append([(strings[0]),(strings[1])])c = (Pie().add("", values).set_colors(["orange","red","blue","green"]).set_global_opts(title_opts=opts.TitleOpts(title="各岗位招聘数量占比分析")).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")).render("output_html/result3.html"))

运行结果:


通过数据分析以及观察可视化效果,可以看出对于数据分析涉及到的这四个岗位:数据分析师,数据挖掘工程师,机器学习工程师,深度学习工程师,其招聘人数占比都差不太多,而其中相比较多的是机器学习工程师和数据挖掘工程师。而随着近年来,大数据,人工智能的发展,对于数据分析,机器学习方面的技术人员需求很大,但同时岗位缺口也很大。


总结

 三个任务是对部分招聘数据的分析处理,通过最终的数据分析及结果可视化观察并结合资料可知:

1.学历与工资水平呈正比;
2.北上广深依旧火热,工资水平依旧处于第一梯队;
3.随着近几年大数据、人工智能的崛起。算法类的职位缺口比较大。
以上三点即为最简洁地概括最终处理结果分析。

关于MapReduce:
MapReduce是一个分布式运算程序的编程框架,是用户开发"基于Hadoop的数据分析应用”的核心框架。

MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成-个完整的分布式运算程序,并发运行在一个Hadoop集群上。
其优缺点:
关于优点

  1. MapReduce易于编程
    它简单的实现一些接口,就可以完成一个分布式程序, 这个分布式程序可以分布到大量廉价的PC机器上运行。也就是说你写一个分布式程序,跟写-个简单的串行程序是一模一样的。 就是因为这个特点使得MapReduce编程变得非常流行。
    2.良好的扩展性
    当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力。
    3.高容错性
    MapReduce设计的初衷就是使程序能够部署在廉价的PC机器上,这就要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由Hadoop内部完成的。
    4.适合PB级以上海量数据的离线处理
    可以实现上千台服务器集群并发工作,提供数据处理能力。
    关于缺点
    1.不擅长实时计算
    MapReduce无法像MySQL-样,在毫秒或者秒级内返回结果。
    2.不擅长流式计算
    流式计算的输入数据是动态的,而MapReduce的输入数据集 是静态的,不能动态变化。这是因为MapReduce自身 的设计特点决定了数据源必须是静态的。
    3.不擅长DAG (有向图)计算
    多个应用程序存在依赖关系,后一个应用程序的输入为前一一个的输出。在这种情况下,MapReduce并不是不能做,而是使用后,每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常的低下。

其核心编程思想:

1)分布式的运算程序往往需要分成至少2个阶段。
2)第一个阶段的MapTask并发实例,完全并行运行,互不相干。
3)第二个阶段的ReduceTask并发实例互不相干,但是他们的数据依赖于上一个阶段的所有MapTask并发实例的输出。
4)MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序,串行运行。
总结:分析WordCount数据流走向深入理解MapReduce核心思想。

其处理的一般步骤:
用户编写的程序分成三个部分:Mapper、Reducer和Driver
(1)map阶段
用户自定义的Mapr要迷承自己的父类;
Mapper的输入数据是KV对的形式(KV的类型可自定义);
Mapper中的业务逻 辑写在map方法中;
Mape的前出数据是KV对的形式(KV的类型可自定义);
map(方法(MapTasb进程) 对每个<K.V>调用-次。
(2)reduce阶段
用户自定义的Reducer要继承自己的父类;
Reducet的输入数据类型对应Mappe的输出数据类型,也是KV;
Reducer的业务逻辑写在reduce方法中;
ReduceTask进程对每组相同k的<k,v>组调用一 次reduce()方法。
(3)Driver阶段
相当于YARN隼群的客户端,用于提交我们整个程序到YARN集群,提交的是封装了MapReduce程字相关运行参数的job对象。

用MapReduce对招聘数据处理分析+可视化相关推荐

  1. python基于爬虫技术的海量电影数据分析源码,数据处理分析可视化,GUI界面展示

    基于爬虫技术的海量电影数据分析 介绍 一个基于爬虫技术的海量电影数据分析系统 系统架构 本系统主要分为四个部分,分别为后端爬虫抓取.数据处理分析可视化.GUI界面展示.启动运行,分别对应getData ...

  2. 招聘数据爬取、数据处理与可视化(v2--解析JS渲染页面)

    招聘数据爬取.数据处理与可视化(v2--解析JS渲染页面) 更新说明 程序说明 数据爬取 观察网页结构 页面解析 将数据写入csv文件中 通过观察页面链接,爬取所有页面 爬虫程序完整代码 爬取数据结果 ...

  3. python气象绘图速成_基于Python气象数据处理与可视化分析

    基于 Python 气象数据处理与可视化分析 张鑫 ; 曹蕾 ; 韩基良 [期刊名称] <气象灾害防御> [年 ( 卷 ), 期] 2020(027)001 [摘要] 全国综合气象信息共享 ...

  4. 《数据科学与大数据分析——数据的发现 分析 可视化与表示》一2.3 第2阶段:数据准备...

    本节书摘来自异步社区<数据科学与大数据分析--数据的发现 分析 可视化与表示>一书中的第2章,第2.3节,作者[美]EMC Education Services(EMC教育服务团队),更多 ...

  5. Smart:类MapReduce的原位科学分析框架

    Smart:类MapReduce的原位科学分析框架 摘要 1.介绍 1.1 动机 1.2 贡献 2.背景和挑战 2.1 背景:原位科学分析和MapReduce 2.2 优势和可行性 2.3 挑战 2. ...

  6. 海量数据处理分析(部分)

    2019独角兽企业重金招聘Python工程师标准>>> 1. 海量数据处理分析    原文地址: http://blog.csdn.net/DaiZiLiang/archive/20 ...

  7. 【转】使用 F#、MapReduce 和 Windows Azure 分析日志文件

    http://msdn.microsoft.com/zh-cn/magazine/gg983490.aspx 使用 F#.MapReduce 和 Windows Azure 分析日志文件 Noah G ...

  8. python商品评论数据采集与分析可视化系统 Flask框架 requests爬虫 NLP情感分析 毕业设计 源码

    一.项目介绍 python商品评论数据采集与分析可视化系统 Flask框架.MySQL数据库. requests爬虫.可抓取指定商品评论.Echarts可视化.评论多维度分析.NLP情感分析.LDA主 ...

  9. 数据可视化:利用Python和Echarts制作“用户消费行为分析”可视化大屏

    数据可视化:利用Python和Echarts制作"用户消费行为分析"可视化大屏 前言 实验目的: 准备工作: 一.创建项目: 二.建立数据库连接获取数据: 三.页面布局: 四.下载 ...

最新文章

  1. 【转】利用matlab生成随机数函数
  2. query AjaxUpload实现多文件上传功能代码实例教程
  3. javaweb---简易邮件发送
  4. JBoss AS 7 EJB3池配置
  5. linux操作系统好吗_国内可以通过安卓+termux打造出适用手机平板和电脑全平台最好的操作系统...
  6. rtk手簿Android代码,合众思壮手簿eSurveyAndroid连接cors账号教程
  7. java模拟浏览器http请求_java使用HttpClient模拟浏览器请求
  8. linux tensorflow例子,基于Docker的TensorFlow机器学习框架搭建和实例源码解读
  9. Linux通过域名查ip
  10. 青果教务php,拟物校园 | 拟物校园,一个高校教务系统爬虫,现支持正方教务、青果教务。...
  11. 使用Windows Server Backup备份与还原Hyper-V虚拟机
  12. GUI提示功控件,LVGL『Label标签控件』介绍
  13. wpa_cli工具的使用方法及分析
  14. Python+AI智能编辑人脸
  15. 在官网上下载慢解决办法
  16. 电脑端手机模拟器软件
  17. 植物基因编辑最新政策解读(2021年7月)
  18. ai如何旋转画布_Illustrator让一个图形沿着某一点或顶点旋转复制教程
  19. 操作系统之操作系统的作用、目标、发展过程、特性和主要功能
  20. ERROR:Xst:899--FPGA ERROR

热门文章

  1. 金字塔原理之表达的逻辑
  2. 针对 dash3 license 破解 dash4
  3. 系统系统应用权限报错Signature|privileged permissions not in privapp-permissions whitelist的解决
  4. maven自动化构建工具出现“编码EUC_CN的不可映射字符”
  5. [EE261学习笔记] 9+.重侧δ函数
  6. 【Access各种类型变量表示】声明模块变量的用法,变量符号用法,文本型变量.日期型变量,数字型变量,数值型变量的符号表示法
  7. 如何从Time Machine还原备份
  8. C# 编写简单易用的 Windows 截屏增强工具
  9. chrome自制插件--动易网站后台一键登录v1.4
  10. 机械冲击测试标准和作用