博客
关于我
【SparkSQL 】扩展 ---- 数据清洗:缺失值处理
阅读量:325 次
发布时间:2019-03-04

本文共 3036 字,大约阅读时间需要 10 分钟。

【SparkSQL 】扩展 ---- 数据清洗:缺失值处理


目录:

    
    

    
    
    


一、什么是缺失值

1.、缺失值的含义

一个值本身的含义是这个值不存在,则称之为缺失值,也就是说这个值本身代表着缺失,或者说这个值本身无意义,比如null、空字符串…

在这里插入图片描述

null —> 对象为空

NAN —> Not A Number


2.、缺失值的产生

  • 从业务系统中来

    在这里插入图片描述

  • 其他数据处理工具所产生的数据


3.、缺失值的类型

在这里插入图片描述


二、DataFrameNaFunctions 缺失值处理框架

1.当数据集中出现缺失值的时候,大致有两种处理方式

  • 一个是丢弃
  • 一个是替换为某值

2.DataFrameMaFunctions中包含一系列针对空值数据的方案:

  • DataFraneNaFunctions.drop 可以在当某行中包含null或NaN的时候丢弃此行
  • DataFraneNaFunctions.fill 可以在格null和NoN充为其它值
  • DataFrameNaFuncttons.replace 可以把null或NaN管换为其它值,但是和 fill 略有一些不同,这个方法针对值来进行替换


三、NaN 、null 缺失值

在这里插入图片描述

案例:有如上所示的文件,其中pm字段包含有NaN值,对其进行处理

  • 读取文件
// 方式一 //2.1 自动判断数据类型读取  val ds = spark.read   .option("header",true)   .option("inferSchema",true)   .csv("dataset/beijing_pm_nan.csv") 缺点: 在推断的时候可能会将数字类型的列中的NaN值推断为字符串类型
// 方式二//2.2 直接读取字符串,在后续过程中使用map算子转换数据类型spark.read .option("header",true) .csv() .map(row => row....)
// 方式三// 2.3 指定Schema,不需要推断 val schema = StructType(   List(     StructField("id", LongType),     StructField("year", IntegerType),     StructField("month", IntegerType),     StructField("day", IntegerType),     StructField("hour", IntegerType),     StructField("season", IntegerType),     StructField("pm", DoubleType)   ) ) val df = spark.read   .option("header", true)   .schema(schema)   .csv("dataset/beijing_pm_nan.csv")

1.丢弃

//   4.1 丢弃 //  2019,12,12,NaN //    规则: //     1.all --- 该行数据都是NaN时才进行删除 df.na.drop("all").show() //     2.any --- 只要有一个数据为NaN就进行删除 df.na.drop("any").show() // 默认的就是any //     3.针对于某些列的特殊规则 df.na.drop("any", List("year", "month", "day", "hour")).show() // any 只作用于List中的列
  • all — 该行数据都是NaN时才进行删除
    在这里插入图片描述
  • any — 只要有一个数据为NaN就进行删除,相比于all的结果来说,当记录中只要一个字段的数据为NaN值,整条记录就会被删除。
    在这里插入图片描述
  • 针对于某些列的特殊规则,相比于上面any的结果,下面的结果保留了pm列为NaN的记录,原因在于本方法处理时,针对了特定的列,并没有把pm列放入。
    在这里插入图片描述
    在这里插入图片描述


2.填充替换

//   4.2 填充 //    规则: //     1.针对所有列数据进行默认值填充 df.na.fill(0).show() //     2.针对特定列进行填充 df.na.fill(0, List("year", "month")).show()
  • 针对所有列数据进行默认值填充
    在这里插入图片描述
  • 针对特定列进行填充
    在这里插入图片描述


四、字符串缺失值

案例:

在这里插入图片描述

// 读取原始数据集 val df = spark.read   .option("header", true)   .option("interSchema", true)   .csv("dataset/BeijingPM20100101_20151231.csv")

通过对原始数据集的读取,我们可以发现在自动推断类型的时候将某些字段以StringType的形式读取,所以在后续的处理中就是针对字符串缺失值。

在这里插入图片描述

1.丢弃

// 1.丢弃df.where('PM_Dongsi =!= "NA").show()
  • 直接丢弃PM_Dongsi列值为NA的记录
    在这里插入图片描述


2.替换

// 2.替换// select name,age,case  // when ... then ...  // ...  // else  import org.apache.spark.sql.functions._  df.select(    'No as "id", 'year, 'month, 'day, 'hour, 'season,    when('PM_Dongsi === "NA", Double.NaN)      .otherwise('PM_Dongsi cast DoubleType)      .as("pm")  ).show()  data_na.na.fill(0,List("pm")).show()
  • 读取数据的时候对PM_Dongsi列的值进行判定,如果为字符串型空值,将其转换为好处理的Double.NaN类型,后续采用空值处理,否则转换其数据类型为DoubleType
    在这里插入图片描述
    在这里插入图片描述


3.用replace将特殊值替换为好处理的值

// 使用replace将特殊值替换为好处理的值// 注意:在转换时,原类型必须和转换后的类型保持一致!df.na.replace("PM_Dongsi", Map("NA" -> "NaN", "NULL" -> "null")).show()
  • 这里使用replace将字符串的NA、null进行了替换,虽然形式匹配,但是依旧是字符串型的数据,还需要再进行类型转换
    在这里插入图片描述
val data_NA = df.na.replace("PM_Dongsi", Map("NA" -> "NaN", "NULL" -> "null")) data_NA.show() // 再次转换数据类型为DoubleType val type_trs = data_NA.select('NO.as("id"),'year,'month,'day,'season,'PM_Dongsi.cast(DoubleType) ) type_trs.show() println(type_trs.schema) // 填充空值 type_trs.na.fill(0).show()

在这里插入图片描述


转载地址:http://zzeq.baihongyu.com/

你可能感兴趣的文章
NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0最新版本安装_配置使用HTTP登录_默认是用HTTPS登录的_Https登录需要输入用户名密码_HTTP不需要---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增加修改实时同步_使用JsonPath及自定义Python脚本_03---大数据之Nifi工作笔记0055
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现update数据实时同步_实际操作05---大数据之Nifi工作笔记0044
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从Oracle11G同步数据到Mysql_亲测可用_解决数据重复_数据跟源表不一致的问题---大数据之Nifi工作笔记0065
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>
NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
查看>>
NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
查看>>