前一篇文章, 已经介绍了 BMR 的基础用法, 再结合 Spark 和 Scala 的文档, 我想应该是可以开始你的数据分析之路的. 这一篇文章, 着重进行一些简单的思路上的引导和分析. 如果你分析招聘数据时, 卡在了某个环节, 可以试着阅读本文. 在继续下面的各种分析前, 请确保已经读完了本系列文章的第三篇, 并正确配置了 BMR, 同时导入了需要的真实招聘数据.
假设我们从数据的采集, 存储到数据的读取与使用, 都是使用传统的语言工具, 比如 nodejs.
我们如果想知道到底有不同的薪水段有多少招聘职位并从多到少排序, 我们可能需要:
步骤, 还算简单. 暂且不提数据集再大些时, 内存是极有可能吃不消; 但是第 2,3 步的逻辑细节, 就需要不少代码判断, 比如如何循环读取文件数据? 如果文件名命名是不规律的呢? 如果文件数据是损坏的不规律数据呢? 文件数据的 json, 并不是一个直接可用的职位数组, json 结构转换的操作, 逻辑上对你来说好实现吗
诚然, 用编程语言, 没有什么做不了的, 只是时间问题; 既然谈到了时间, 如果有另外一种明显快的多的方式, 你会不用吗
使用 Spark 实现上述同样的逻辑. 以下操作, 基于交互编程工具 Zeppelin:
- val job = sqlContext.read.json("jobs") job.registerTempTable("job") job.printSchema()
- % 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 功底, 不是特别好, 我的建议是: 有空多看看, 有需求时先打英文关键词
送给有需要的童鞋:
- % 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 仓库:
来源: http://www.cnblogs.com/ios122/p/5848229.html