概述

前一篇文章,已经介绍了BMR的基础用法,再结合Spark和Scala的文档,我想应该是可以开始你的数据分析之路的.这一篇文章,着重进行一些简单的思路上的引导和分析.如果你分析招聘数据时,卡在了某个环节,可以试着阅读本文. 在继续下面的各种分析前,请确保已经读完了本系列文章的第三篇,并正确配置了BMR,同时导入了需要的真实招聘数据.

如果用传统编程语言工具?

假设我们从数据的采集,存储到数据的读取与使用,都是使用传统的语言工具,比如nodejs.

我们如果想知道到底有不同的薪水段有多少招聘职位并从多到少排序,我们可能需要:

  1. 新建对象,存储各个公司的数据;
  2. 循环读取数据,丰富各个公司的数据;
  3. 以薪水为分组,记录各个公司各个职位的信息;
  4. 以招聘数量为标准排序;

步骤,还算简单.暂且不提数据集再大些时,内存是极有可能吃不消;但是第2,3步的逻辑细节,就需要不少代码判断,比如如何循环读取文件数据?如果文件名命名是不规律的呢?如果文件数据是损坏的不规律数据呢?文件数据的json,并不是一个直接可用的职位数组,json结构转换的操作,逻辑上对你来说好实现吗?

诚然,用编程语言,没有什么做不了的,只是时间问题;既然谈到了时间,如果有另外一种明显快的多的方式,你会不用吗?

使用Spark进行分析

使用Spark实现上述同样的逻辑.以下操作,基于交互编程工具Zeppelin:

1.读取数据

val job = sqlContext.read.json("jobs")
job.registerTempTable("job")
job.printSchema()

2.获取各个薪水段职位数量,并排序

%sql
SELECT postionCol.salary,COUNT(postionCol.salary) salary_count
FROM job
LATERAL VIEW explode(content.positionResult.result) positionTable AS postionCol
WHERE content.positionResult.queryAnalysisInfo.positionName="ios"
GROUP BY postionCol.salary
ORDER BY salary_count DESC

真的可以直接使用类似于SQL的语法,进行半结构数据的复杂查询,不知道各位看官,看完有何感想?

如果你的SQL功底,不是特别好,我的建议是:有空多看看文档,有需求时先打英文关键词google

几个你可能感兴趣的数据的sparkSQL示例查询

送给有需要的童鞋:

按公司名显示某职位的招聘数量


%sql
SELECT postionCol.companyFullName,COUNT(postionCol.companyFullName) postition_count
FROM job
LATERAL VIEW explode(content.positionResult.result) positionTable AS postionCol
WHERE content.positionResult.queryAnalysisInfo.positionName="ios"
GROUP BY postionCol.companyFullName
ORDER BY postition_count DESC

显示某一职位对工作年限的要求

%sql
SELECT postionCol.workYear,COUNT(postionCol.workYear) workYears
FROM job
LATERAL VIEW explode(content.positionResult.result) positionTable AS postionCol
WHERE content.positionResult.queryAnalysisInfo.positionName="ios"
GROUP BY postionCol.workYear
ORDER BY workYears DESC

显示某一职位对学历的要求


%sql
SELECT postionCol.education,COUNT(postionCol.education) education_count
FROM job
LATERAL VIEW explode(content.positionResult.result) positionTable AS postionCol
WHERE content.positionResult.queryAnalysisInfo.positionName="ios"
GROUP BY postionCol.education
ORDER BY education_count DESC

显示某一职位各个公司的规模

%sql
SELECT postionCol.companySize,COUNT(postionCol.companySize) company_size_ount
FROM job
LATERAL VIEW explode(content.positionResult.result) positionTable AS postionCol
WHERE content.positionResult.queryAnalysisInfo.positionName="ios"
GROUP BY postionCol.companySize
ORDER BY company_size_ount DESC

系列后记

这是第一个系列文章.我觉得,我还是说清楚了一些问题的.文章本身的价值,决定于是否它能遇到刚好需要它的人.这些东西就交给时间!单就本系列而言,最后聚合分析出的结果,连我自己都很经验.现在招聘市场对中高端人才的需求比例竟然如此之大,突然发现我的思维还停留在里两年前,那个"大白"横行的时代.

坦白说,我一直在寻找着我这么做的意义.系列文章的第一篇和第二篇阅读量都很少.但是,很庆幸,我继续坚持写了第三篇,终于有人慢慢认可和阅读了,顺带着前两篇的阅读量月多了些.

我们还是应该相信,人们对于美好的有价值的东西是有鉴赏能力的;如果你觉得没有,可能刚好你的付出,没有被有需要的人看到.

把自己感觉有价值的东西,记录下来,其他的就交给时间--这就是最后我想对那些可爱的努力想写博客分享东西的童鞋说的!一起加油↖(ω)↗


本系列专属gitub仓库:https://github.com/ios122/spark_lagou

使用Spark分析拉勾网招聘信息(四): 几个常用的脚本与图片分析结果的更多相关文章

  1. 使用Spark分析拉勾网招聘信息(一):准备工作

    本系列专属github地址:https://github.com/ios122/spark_lagou 前言 我觉得如果动笔,就应该努力地把要说的东西表达清楚.今后一段时间,尝试下系列博客文章.简单说 ...

  2. 使用Spark分析拉勾网招聘信息(二): 获取数据

    要获取什么样的数据? 我们要获取的数据,是指那些公开的,可以轻易地获取地数据.如果你有完整的数据集,肯定是极好的,但一般都很难通过还算正当的方式轻易获取.单就本系列文章要研究的实时招聘信息来讲,能获取 ...

  3. 使用Spark分析拉勾网招聘信息(三): BMR 入门

    简述 本文,意在以最小的篇幅,来帮助对大数据和Spark感兴趣的小伙伴,能尽快搭建一个可用的Spark开发环境.力求言简意赅.文章,不敢自称BMR的最佳实践,但绝对可以帮助初学者,迅速入门,能够专心于 ...

  4. 爬取拉勾网招聘信息并使用xlwt存入Excel

    xlwt 1.3.0 xlwt 文档 xlrd 1.1.0 python操作excel之xlrd 1.Python模块介绍 - xlwt ,什么是xlwt? Python语言中,写入Excel文件的扩 ...

  5. Python3获取拉勾网招聘信息

    为了了解跟python数据分析有关行业的信息,大概地了解一下对这个行业的要求以及薪资状况,我决定从网上获取信息并进行分析.既然想要分析就必须要有数据,于是我选择了拉勾,冒着危险深入内部,从他们那里得到 ...

  6. python-scrapy爬虫框架爬取拉勾网招聘信息

    本文实例为爬取拉勾网上的python相关的职位信息, 这些信息在职位详情页上, 如职位名, 薪资, 公司名等等. 分析思路 分析查询结果页 在拉勾网搜索框中搜索'python'关键字, 在浏览器地址栏 ...

  7. Python爬取拉勾网招聘信息并写入Excel

    这个是我想爬取的链接:http://www.lagou.com/zhaopin/Python/?labelWords=label 页面显示如下: 在Chrome浏览器中审查元素,找到对应的链接: 然后 ...

  8. Spark学习之路(四)—— RDD常用算子详解

    一.Transformation spark常用的Transformation算子如下表: Transformation算子 Meaning(含义) map(func) 对原RDD中每个元素运用 fu ...

  9. jmeter(四十五)常用Beanshell脚本

    整理了一批jmeter常用的beanshell脚本供大家参考! 时间戳 import java.text.SimpleDateFormat; import java.util.Calendar; im ...

随机推荐

  1. centos git 服务器搭建

    1.安装git sudo yum -y install git 2.创建用户与授权 # 找到 git_shell whereis git_shell /usr/bin/git-shell # 创建 g ...

  2. 图解:Arcgis Server 安装

    必须保证IIS配置正常,否则arcserver安装不会成功. 选择安装路径,还是尽量不要在有括号的文件夹下. 设置服务名,最好使用默认的. 点击完成后会要求进行服务配置. 在windows serve ...

  3. nginx(2、反向代理)

    反向代理是nginx最重要的特性之一,与正向代理相反,它代理的不是客户端,而是目标源,即我代理目标源满足客户端给出的请求. 在nginx中反向代理的简单配置如下: server { listen 80 ...

  4. WCF基础教程之异常处理:你的Try..Catch语句真的能捕获到异常吗?

    在上一篇WCF基础教程之开篇:创建.测试和调用WCF博客中,我们简单的介绍了如何创建一个WCF服务并调用这个服务.其实,上一篇博客主要是为了今天这篇博客做铺垫,考虑到网上大多数WCF教程都是从基础讲起 ...

  5. FusionCharts简单教程(四)-----基本数字格式

          在统计图例中什么是最基本,最重要的元素?那就是数据.一个数据的统计图像那就是一堆空白.但是数据存在多种形式,比如小数,比如千分位等等.又如若一个数据是12.000000001,对于数据要求 ...

  6. 《OOC》笔记(2)——C语言实现trycatchfinally

    本篇就偷个懒吧,实在打不起精神. #ifndef _TRY_THROW_CATCH_H_ #define _TRY_THROW_CATCH_H_ #include <stdio.h> #i ...

  7. Flex contextMenu

    没想到再这里也要跌跌撞撞. 这个东西我很久之前就懂了的啊! 最开始是这么写的: private function init():void { var contextMenu:ContextMenu = ...

  8. java API:AtomicInteger

    An int value that may be updated atomically. See the java.util.concurrent.atomic package specificati ...

  9. Vue.js线程机制问题还是数据双向绑定有延迟的问题

    最近用select2做一个下拉多选,若只是从后端获取一个列表渲染还好说,没有任何问题.但要用select2对数据初始化时进行selected的默认选项进行显示,就出现问题了. vm.$set('are ...

  10. Java集合框架知识总结

    两大体系:Collection,Map 一.Collection: List 接口 : List:里面对象全部是有序的(通过三种方法来遍历) ArrayList,LinkedList,Vertor A ...