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

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

数据清洗:缺失值处理

缺失值在数据分析中是一个常见的问题,处理不当可能导致分析结果偏差。SparkSQL 提供了强大的数据处理框架,能够有效应对缺失值问题。本文将详细介绍缺失值的定义、产生类型以及处理方法。

一、缺失值的含义

缺失值是指数据中缺失的值,通常表示该值本身无意义或未能获取。常见的表示方式包括 null、空字符串('')、NAN(Not a Number,非数值)等。在数据处理中,缺失值可能导致分析结果误差或计算异常。

举例说明
  • null:对象为空,表示缺失值。
  • NAN:表示数值数据中的无效值。

二、缺失值的产生

缺失值可能来自多个来源:

  • 业务系统:数据生成过程中未能获取相关信息。
  • 数据处理工具:其他工具在转换数据时未能处理特殊情况。
  • 三、缺失值的类型

    缺失值可按类型分类:

  • 数据类型缺失:如 Integer 列中出现 null
  • 数值缺失:如 Double 列中出现 NAN
  • 字符串缺失:如 StringType 列中出现空值。

  • DataFrameNaFunctions 缺失值处理框架

    在处理缺失值时,SparkSQL 提供了 DataFrameNaFunctions框架,支持两种主要方式:

  • 丢弃:移除包含缺失值的记录。
  • 替换:将缺失值替换为指定值。
  • DataFrameNaFunctions 的具体方法

    • drop:移除包含缺失值的行。

      • df.na.drop("all"):仅移除全为 null 的记录。
      • df.na.drop("any"):移除包含任意一列为 null 的记录。
      • 列指定:如 df.na.drop("any", List("year", "month")),仅移除 yearmonth 列中存在 null 的记录。
    • fill:替换缺失值。

      • df.na.fill(0):将所有缺失值替换为 0
      • df.na.fill(0, List("year", "month")):仅替换 yearmonth 列的缺失值。
    • replace:按值替换缺失值。

      • df.na.replace("PM_Dongsi", Map("NA" -> "NaN", "NULL" -> "null")):替换特定字段的特定值。

    NaN 、null 缺失值的处理

    例子:PM 数据中包含 NaN 值的处理

  • 读取数据

    • 方式一:val ds = spark.read.option("header", true).option("inferSchema", true).csv("dataset/beijing_pm_nan.csv")
    • 方式二:spark.read.option("header", true).csv().map(row -> row...)
    • 方式三:val schema = StructType(...),并指定数据类型。
  • 丢弃 NaN 记录

    • df.na.drop("all")df.na.drop("any")df.na.drop("any", List("year", "month"))
  • 填充 NaN

    • df.na.fill(0):默认填充。
    • df.na.fill(0, List("year", "month")):指定列填充。

  • 字符串缺失值的处理

    例子:PM_Dongsi 列中的 NA 值处理

  • 读取数据

    • val df = spark.read.option("header", true).option("inferSchema", true).csv("dataset/BeijingPM20100101_20151231.csv")
  • 处理方法

    • 丢弃df.where('PM_Dongsi =!= "NA").show()
    • 替换
      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()
    • 特殊值替换
      val data_NA = df.na.replace("PM_Dongsi", Map("NA" -> "NaN", "NULL" -> "null"))val type_trs = data_NA.select('No.as("id"), 'year, 'month, 'day, 'season, 'PM_Dongsi.cast(DoubleType))type_trs.na.fill(0).show()

  • 通过以上方法,SparkSQL 提供了灵活的缺失值处理方案,确保数据质量和分析准确性。

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

    你可能感兴趣的文章
    SQL Server 存储过程分页。
    查看>>
    OSPFv3:第三版OSPF除了支持IPv6,还有这些强大的特性!
    查看>>
    OSPF不能发现其他区域路由时,该怎么办?
    查看>>
    OSPF两个版本:OSPFv3与OSPFv2到底有啥区别?
    查看>>
    SQL Server 存储过程
    查看>>
    OSPF在什么情况下会进行Router ID的重新选取?
    查看>>
    OSPF在大型网络中的应用:高效路由与可扩展性
    查看>>
    OSPF太难了,这份OSPF综合实验请每位网络工程师查收,周末弯道超车!
    查看>>
    OSPF技术入门(第三十四课)
    查看>>
    OSPF技术连载10:OSPF 缺省路由
    查看>>
    OSPF技术连载11:OSPF 8种 LSA 类型,6000字总结!
    查看>>
    OSPF技术连载12:OSPF LSA泛洪——维护网络拓扑的关键
    查看>>
    OSPF技术连载13:OSPF Hello 间隔和 Dead 间隔
    查看>>
    OSPF技术连载14:OSPF路由器唯一标识符——Router ID
    查看>>
    OSPF技术连载15:OSPF 数据包的类型、格式和邻居发现的过程
    查看>>
    OSPF技术连载16:DR和BDR选举机制,一篇文章搞定!
    查看>>
    OSPF技术连载17:优化OSPF网络性能利器——被动接口!
    查看>>
    OSPF技术连载18:OSPF网络类型:非广播、广播、点对多点、点对多点非广播、点对点
    查看>>
    OSPF技术连载19:深入解析OSPF特殊区域
    查看>>
    SQL Server 复制 订阅与发布
    查看>>