读完本篇你将收获

  1. 如何利用spark读取csv文件,并设置灵活的参数
  2. spark dataframe和rdd的转换
  3. spark 如何写到mysql内
  4. 熟悉java正则
  5. 熟悉日期类
  6. spark 常见算子

查看原数据格式(51job上的数据)

job_id,job_name,job_price,job_url,job_time,job_place,job_edu,job_exp,job_well,company_name,company_type,company_mag,company_genre
131132713,Java开发工程师,,https://jobs.51job.com/shenzhen-ftq/131132713.html?s=sou_sou_soulb&t=0,2021-04-19 13:31:43,深圳-福田区,大专,3-4年经验,五险一金 专业培训,上海任仕达人才服务有限公司,外资(欧美),150-500人,专业服务(咨询、人力资源、财会)
130900194,Java后台开发,1-1.5万/月,https://jobs.51job.com/wuhan-dxhq/130900194.html?s=sou_sou_soulb&t=0,2021-04-19 12:08:32,武汉-东西湖区,大专,3-4年经验,五险一金 绩效奖金 年终奖金 定期体检 带薪年假 节日福利 14薪,良品铺子股份有限公司,上市公司,10000人以上,快速消费品(食品、饮料、化妆品)

清洗要求

  1. job_exp :取最大数值,例如:5-7年经验 ->7,无需经验则为0,空值设为0
  2. job_price:取平均工资,1-1.5万/月 ->12500,空值设为0
  3. job_time:精确到日期,2021-04-19 13:31:43->2021-04-19,空值设为无发布时间
  4. company_type:去掉括号以及括号里的数据
  5. company_mag:取最大数,150-500人->500,空值设为0
  6. company_genre:去掉括号以及括号里的数据
  7. 去重

编写代码

  1. 创建maven项目贴入依赖(注意和自己的scala版本对应)
 <dependency><groupId>org.apache.spark</groupId><artifactId>spark-sql_2.11</artifactId><version>2.1.1</version></dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.15</version></dependency>
  1. 编写主程序
case class Res(job_id:String,job_name:String,job_price:String,job_url:String,job_time:String,job_place:String,job_edu:String,job_exp:String,job_well:String,company_name:String,company_type:String,company_mag:String,company_genre:String)
object homework1 {def main(args: Array[String]): Unit = {val session = SparkSession.builder().master("local").appName("te").getOrCreate()val rdd: RDD[Row] = session.read.option("delimiter",",").option("header","true").csv("C:\\Users\\fanhuazeng\\Desktop\\data2.csv").distinct().rddval properties: Properties = new Properties()properties.put("user","root")properties.put("password","123456")val pattern = Pattern.compile("\\d+")val format: SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")val toformat: SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd")val pattern1 = Pattern.compile("^(\\d+?\\.?\\d*?)\\-(\\d+?\\.?\\d*?)万/月$")val pattern2 = Pattern.compile("^(\\d+?\\.?\\d*?)\\-(\\d+?\\.?\\d*?)千/月$")val pattern3 = Pattern.compile("^(\\d+?)元/小时$")val pattern4 = Pattern.compile("^(\\d+?)元/天$")val pattern5 = Pattern.compile("^(\\d+?\\.?\\d*?)千(以下|以上)?/月$")val pattern6 = Pattern.compile("^(\\d+?\\.?\\d*?)\\-(\\d+?\\.?\\d*?)万/月$")val pattern7 = Pattern.compile("^(\\d+?\\.?\\d*?)万(以下|以上)/月$")val pattern8 = Pattern.compile("^(\\d+?\\.?\\d*?)万(以下|以上)/年$")val pattern9 = Pattern.compile("^(\\d+?\\.?\\d*?)\\-(\\d+?\\.?\\d*?)万/年$")import session.implicits._rdd.map((item)=>{//1.jobexpvar item6="0"if(item.isNullAt(7)||item.equals("")||((!item.isNullAt(7))&item.getAs[String](7).equals("无需经验"))){item6="0"}else{val matcher: Matcher = pattern.matcher(item.getAs[String](7))while (matcher.find()){if(matcher.group().toInt>item6.toInt){item6=matcher.group()}}}//3.jobtimevar jobtime="无发布时间"if(!item.isNullAt(4)){jobtime = toformat.format(format.parse(item.getAs(4)))}//4.company_type 去掉括号数据var company_type=""if(!item.isNullAt(10)){val strings: Array[String] = item.getAs(10).toString.split("\\(.*?\\)")for (i <- strings){company_type+=i}}//6.company_genre:去掉括号数据var company_genre=""if(!item.isNullAt(12)) {val strings2: Array[String] = item.getAs(12).toString.split("\\(.*?\\)")for (i <- strings2) {company_genre += i}}//5.company_magvar company_mag="0"if(!item.isNullAt(11)){val matcher2: Matcher = pattern.matcher(item.getAs(11).toString)while (matcher2.find()){if(matcher2.group().toInt>company_mag.toInt){company_mag=matcher2.group()}}}//2.job_price:取平均工资var job_price=0if(item.isNullAt(2)){job_price=0}else{val matcher1 = pattern1.matcher(item.getAs(2))val matcher2 = pattern2.matcher(item.getAs(2))val matcher4 = pattern4.matcher(item.getAs(2))val matcher3 = pattern3.matcher(item.getAs(2))val matcher5 = pattern5.matcher(item.getAs(2))val matcher6 = pattern6.matcher(item.getAs(2))val matcher7 = pattern7.matcher(item.getAs(2))val matcher8 = pattern8.matcher(item.getAs(2))val matcher9 = pattern9.matcher(item.getAs(2))if(matcher1.find()){job_price=(matcher1.group(1).toDouble*10000+matcher1.group(2).toDouble*10000).toInt/2}else if(matcher2.find()){job_price= (matcher2.group(1).toDouble*10000+matcher2.group(2).toDouble*10000).toInt/2}else if(matcher3.find()){job_price= matcher3.group(1).toInt*24*30}else if(matcher4.find()){job_price=matcher4.group(1).toInt*30}else if(matcher5.find()){job_price=(matcher5.group(1).toDouble*1000).toInt} else if(matcher6.find()) {job_price=(matcher6.group(1).toDouble*10000+matcher6.group(2).toDouble*10000).toInt} else if(matcher7.find()) {job_price = (matcher7.group(1).toDouble*10000).toInt} else  if(matcher8.find()){job_price = (matcher8.group(1).toDouble*10000/12).toInt} else if(matcher9.find()){job_price=((matcher9.group(1).toDouble*10000+matcher9.group(2).toDouble*10000)/12 ).toInt}}Res(item.getAs[String](0),item.getAs[String](1),job_price.toString,item.getAs[String](3),jobtime,item.getAs[String](5),item.getAs[String](6),item6,item.getAs[String](8),item.getAs[String](9),item.getAs[String](10),company_mag,company_genre)}).toDF().write.mode(SaveMode.Overwrite).jdbc("jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8","test",properties)}
}

我的收获

在利用spark做清洗的时候,需要十分严谨,如果你无法保证每个字段都不为空的清况,十分有必要判空,否则爆空指针异常就会终止程序的运行

文末

我通过sql发现一个1500-3000万/月的岗位,哈哈哈哈哈哈哈哈哈哈哈哈!

如果需要本程序数据的可以私信我哦!共同学习!

Spark数据清洗案例相关推荐

  1. 从原理到策略算法再到架构产品看推荐系统 | 附Spark实践案例

    原文链接:mp.weixin.qq.com  作者 | HCY崇远 01 前言 本文源自于前阵子连续更新的推荐系统系列,前段时间给朋友整理一个关于推荐系统相关的知识教学体系,刚好自身业务中,预计明年初 ...

  2. 大数据培训课程数据清洗案例实操-简单解析版

    数据清洗(ETL) 在运行核心业务MapReduce程序之前,往往要先对数据进行清洗,清理掉不符合用户要求的数据.清理的过程往往只需要运行Mapper程序,不需要运行Reduce程序.大数据培训 数据 ...

  3. Spark RDD案例(五)经纬度转换为地理位置

    Spark RDD案例(五)经纬度转换为地理位置 1. 背景 Spark作为大数据分析引擎,本身可以做离线和准实时数据处理 Spark抽象出的操作对象如RDD.dataSet.dataFrame.DS ...

  4. 大数据Spark入门案例5–统计广告点击数量排行Top3(scala版本)

    大数据Spark入门案例5–统计每广告点击数量排行Top3(scala版本) 1 数据准备 链接:https://pan.baidu.com/s/1afzmL-hNsAJl1_gx_dH2ag 提取码 ...

  5. Apache Spark+PyTorch 案例实战

    Apache Spark+PyTorch 案例实战  随着数据量和复杂性的不断增长,深度学习是提供大数据预测分析解决方案的理想方法,需要增加计算处理能力和更先进的图形处理器.通过深度学习,能够利用非结 ...

  6. Spark商业案例与性能调优实战100课》第16课:商业案例之NBA篮球运动员大数据分析系统架构和实现思路

    Spark商业案例与性能调优实战100课>第16课:商业案例之NBA篮球运动员大数据分析系统架构和实现思路 http://www.basketball-reference.com/leagues ...

  7. Spark商业案例与性能调优实战100课》第2课:商业案例之通过RDD实现分析大数据电影点评系统中电影流行度分析

    Spark商业案例与性能调优实战100课>第2课:商业案例之通过RDD实现分析大数据电影点评系统中电影流行度分析 package com.dt.spark.coresimport org.apa ...

  8. 《Spark商业案例与性能调优实战100课》第17课:商业案例之NBA篮球运动员大数据分析系统代码实战

    <<<Spark商业案例与性能调优实战100课>第17课:商业案例之NBA篮球运动员大数据分析系统代码实战

  9. 《Spark商业案例与性能调优实战100课》第18课:商业案例之NBA篮球运动员大数据分析代码实战之核心基础数据项编写

    <Spark商业案例与性能调优实战100课>第18课:商业案例之NBA篮球运动员大数据分析代码实战之核心基础数据项编写

最新文章

  1. 可疑文件_【国家标准】印刷文件鉴定技术规范点阵式打印文件的同机鉴定
  2. 什么限制了GNN的能力?首篇探究GNN普适性与局限性的论文出炉
  3. asp.net 2.0 语言包 全球化
  4. DeepLab v2的摘要部分(翻译加理解)
  5. S5PV210开发 -- 烧写/启动模式
  6. 飞行模式的开启和关闭
  7. Qt文档阅读笔记-Qt Quick Controls - Wearable Demo实例解析
  8. Zookeeper深入系列-从Zookeeper中深入JMX原理
  9. 不设置DIV的宽高,让它相对于页面水平垂直居中
  10. android 内存分析 郭霖_android 内存泄漏(OOM)问题总结
  11. 值从哪里来_内存频率是怎么算出来的?2133MHz这么奇怪的数字是怎么来的?
  12. python12306源码_Python动刷新抢12306火车票的代码(附源码)
  13. python之路_mysql数据操作1
  14. linux筛选方式,使用grep实现精确过滤的五种方法
  15. 人人开源项目搭建到服务器,人人开源系列项目介绍以及环境搭建
  16. html阅读器 怎么卸载,internetexplorer怎么卸载
  17. 网站地图是什么,怎么制作和查看网站的地图呢?
  18. goldengate mysql to oracle,goldengate mysql to oracle OGG-00146 求助!
  19. 程序中的地址转换(虚拟地址-物理地址)
  20. jwt-auth官方文档

热门文章

  1. 顶级技术公司的CEO是如何看待AI的?
  2. 第2章 - 论题和结论是什么 (了解论题)
  3. 团队管理18--员工激励
  4. IOS 苹果 App 转移图文详解
  5. potainer 日志_【转】专治脑壳疼 | 横扫七大烦恼!日志数据分析还可以这样做!...
  6. 商汤科技通用视觉部门招聘算法研究类岗位(校招/社招/实习生)
  7. nmn几岁可以吃,nmn多少岁可以吃,归纳总结!
  8. 重启与新生,哪家在线教育的转型最有看点?
  9. MTCNN(一)python代码训练与运行
  10. 计算机应用基础第二版在线作业c,计算机应用基础(第2版)-在线作业_C.doc