数据操作——缺失值处理

这篇具有很好参考价值的文章主要介绍了数据操作——缺失值处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

缺失值处理

缺失值的处理思路

如果想探究如何处理无效值, 首先要知道无效值从哪来, 从而分析可能产生的无效值有哪些类型, 在分别去看如何处理无效值

  • 什么是缺失值

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

    数据操作——缺失值处理,大数据,Spark,spark,大数据,mysql,hive,scala

    关于数据的分析其实就是统计分析的概念, 如果这样的话, 当数据集中存在缺失值, 则无法进行统计和分析, 对很多操作都有影响

  • 缺失值如何产生的

    数据操作——缺失值处理,大数据,Spark,spark,大数据,mysql,hive,scala

    Spark 大多时候处理的数据来自于业务系统中, 业务系统中可能会因为各种原因, 产生一些异常的数据

    例如说 因为前后端的判断失误, 提交了一些非法参数. 再例如说因为业务系统修改 MySQL 表结构产生的一些空值数据等. 总之在业务系统中出现缺失值其实是非常常见的一件事, 所以大数据系统就一定要考虑这件事.

  • 缺失值的类型

    常见的缺失值有两种

    • null, NaN 等特殊类型的值, 某些语言中 null 可以理解是一个对象, 但是代表没有对象, NaN 是一个数字, 可以代表不是数字

      针对这一类的缺失值, Spark 提供了一个名为 DataFrameNaFunctions 特殊类型来操作和处理

    • “Null”, “NA”, " " 等解析为字符串的类型, 但是其实并不是常规字符串数据

      针对这类字符串, 需要对数据集进行采样, 观察异常数据, 总结经验, 各个击破

  • DataFrameNaFunctions

    DataFrameNaFunctions 使用 Dataset 的 na 函数来获取

    val df = ...
    val naFunc: DataFrameNaFunctions = df.na
    

    当数据集中出现缺失值的时候, 大致有两种处理方式, 一个是丢弃, 一个是替换为某值, DataFrameNaFunctions 中包含一系列针对空值数据的方案

    • DataFrameNaFunctions.drop 可以在当某行中包含 null 或 NaN 的时候丢弃此行
    • DataFrameNaFunctions.fill 可以在将 null 和 NaN 充为其它值
    • DataFrameNaFunctions.replace 可以把 null 或 NaN 替换为其它值, 但是和 fill 略有一些不同, 这个方法针对值来进行替换
  • 如何使用 SparkSQL 处理 null 和 NaN(Double.NaN → Not a number) ?

    首先要将数据读取出来, 此次使用的数据集直接存在 NaN, 在指定 Schema 后, 可直接被转为 Double.NaN

    @Test
    def nullAndNaN():Unit ={
    
      // 2. 导入数据集
      // 3. 读取数据集
      //    1.通过Spark-csv自动的推断类型来读取,推断数字的时候会将NaN推断为字符串
    //    spark.read
    //      .option("header",true)
    //      .option("inferSchema",true)
    //      .csv(....)
    
      //    2. 直接读取字符串,在后续的操作中使用 map 算子转类型
    //    spark.read.csv().map(row => row....)
    
      //    3. 指定 Schema ,不要自动推断
      // 创建 Schema
      val schema = StructType(
        List(
          StructField("id", LongType),
          StructField("year", IntegerType),
          StructField("month", IntegerType),
          StructField("day", IntegerType),
          StructField("session", IntegerType),
          StructField("pm", DoubleType)
        )
      )
      // Double.NaN
      val sourceDF = spark.read
        .option("header",true)
        .schema(schema)
        .csv("./dataset/beijingpm_with_nan.csv") // pm下的NaN 自动转为 Double.NaN
    
      sourceDF.show()
    }
    

    数据操作——缺失值处理,大数据,Spark,spark,大数据,mysql,hive,scala

    对于缺失值的处理一般就是丢弃和填充

    • 丢弃包含 null 和 NaN 的行

      // 4.丢弃
      // 2019,12,12,Nam
      // 规则:
      //    1. any, 只要有一个 NaN 的行就丢弃
      sourceDF.na.drop("any").show() // sourceDF.na.drop().show() 默认 any
      //    2. all, 所有数据都是 NaN 的行才丢弃
      sourceDF.na.drop("all").show()
      //    3. 某些列的规则
      sourceDF.na.drop("any",List("year","month","day")).show()**
      
    • 填充包含 null 和 NaN 的列

      **// 5.填充
        // 规则:
        //    1. 针对所有列数据进行默认值填充
        sourceDF.na.fill(0).show()
        //    2. 针对特定列填充
        sourceDF.na.fill(0, List("year", "month")).show()
      }**
      
  • 如何使用 SparkSQL 处理异常字符串 ?

    读取数据集, 这次读取的是最原始的那个 PM 数据集

    **val df = spark.read
      .option("header", value = true)
      .csv("./dataset/BeijingPM20100101_20151231.csv")**
    

    使用函数直接转换非法的字符串

    **// 1. 替换
      // select name, age, case
      // when .. then...
      // else
      import org.apache.spark.sql.functions._ // 使用when 需要导入
      sourceDF.select(
        'No as "id", 'year, 'month, 'day, 'hour, 'season,
        when('PM_Dongsi === "NA", Double.NaN) // 当 PM_Donsi 里的数据 等于 NA 时,变为 Double.NaN
          .otherwise('PM_Dongsi cast DoubleType) // 如果不是上面的条件,要将它的正常值转换成对应的Double类型
          .as("pm") // 起别名
      ).show()
    
    // replace 注意:原类型和转换过后的类型,必须一致
    sourceDF.na.replace("PM_Dongsi", Map("NA" -> "NaN")).show()
    // sourceDF.na.replace("PM_Dongsi", Map("NA" -> "NaN", "NULL" -> "null")).show()
    
    

    数据操作——缺失值处理,大数据,Spark,spark,大数据,mysql,hive,scala

    数据操作——缺失值处理,大数据,Spark,spark,大数据,mysql,hive,scala

    使用 where 直接过滤

    df.select('No as "id", 'year, 'month, 'day, 'hour, 'season, 'PM_Dongsi)
      .where('PM_Dongsi =!= "NA") // =!= 不等于
      .show()
    

    数据操作——缺失值处理,大数据,Spark,spark,大数据,mysql,hive,scala

  • 所用文件

    [beijingpm_with_nan.rar]

    [BeijingPM20100101_20151231.rar](前面已上传,自己根据名称去资源下载)

  • 以上代码的前置条件文章来源地址https://www.toymoban.com/news/detail-816188.html

    // 1. 创建SparkSession对象
    val spark = SparkSession.builder().appName("column").master("local[6]").getOrCreate()
    
    import spark.implicits._
    
    case class Person(name: String, age: Int)
    

到了这里,关于数据操作——缺失值处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大数据之使用Spark增量抽取MySQL的数据到Hive数据库(1)

    前言 题目: 一、读题分析 二、处理过程 1.采用SparkSQL使用max函数找到最大的日期然后转换成时间类型在变成字符串 2.这里提供除了SQL方法外的另一种过滤不满足条件的方法 三、重难点分析 总结  本题来源于全国职业技能大赛之大数据技术赛项 电商 赛题-离线数据处理-抽取

    2024年02月08日
    浏览(51)
  • 大数据之使用Spark全量抽取MySQL的数据到Hive数据库

    前言 一、读题分析 二、使用步骤 1.导入配置文件到pom.xml 2.代码部分 三、重难点分析 总结 本题来源于全国职业技能大赛之大数据技术赛项赛题-离线数据处理-数据抽取(其他暂不透露) 题目:编写Scala代码,使用Spark将MySQL的shtd_industry库中表EnvironmentData,ChangeRecord,BaseMach

    2024年02月11日
    浏览(47)
  • Spark大数据处理讲课笔记4.2 Spark SQL数据源 - 基本操作

      目录 零、本讲学习目标 一、基本操作 二、默认数据源 (一)默认数据源Parquet (二)案例演示读取Parquet文件 1、在Spark Shell中演示 2、通过Scala程序演示 三、手动指定数据源 (一)format()与option()方法概述 (二)案例演示读取不同数据源 1、读取房源csv文件 2、读取json,保

    2024年02月09日
    浏览(43)
  • spark stream入门案例:netcat准实时处理wordCount(scala 编程)

    目录 案例需求 代码 结果 解析          案例需求:         使用netcat工具向9999端口不断的发送数据,通过SparkStreaming读取端口数据并统计不同单词出现的次数         -- 1. Spark从socket中获取数据:一行一行的获取         -- 2. Driver程序执行时,streaming处理过程

    2024年02月07日
    浏览(40)
  • Spark—通过Java、Scala API实现WordCount案例的基本操作

    实验原理 Spark的核心就是RDD,所有在RDD上的操作会被运行在Cluster上,Driver程序启动很多Workers,Workers在(分布式)文件系统中读取数据后转化为RDD(弹性分布式数据集),然后对RDD在内存中进行缓存和计算。 而RDD有两种类型的操作 ,分别是Action(返回values)和Transformations(

    2024年02月15日
    浏览(41)
  • Spark Scala大数据编程实例

    Scala是一门现代的多范式编程语言,平滑地集成了面向对象和函数式语言的特性,旨在以简练、优雅的方式来表达常用编程模式。Scala的设计吸收借鉴了许多种编程语言的思想,只有很少量特点是Scala自己独有的。Scala语言的名称来自于“可伸展的语言”,从写个小脚本到建立

    2024年02月04日
    浏览(47)
  • 19 | spark 统计 每列的数据非缺失值

    计算CSV文件中每列的数据覆盖率(非缺失值的百分比)时,您可以使用提供的Java代码来完成这项任务。以下是更详细的步骤: 1. 导入所需库和设置Spark配置 首先,您需要导入所需的Java库,并设置Spark的配置。这些库包括Apache Spark的Java库以及用于数据处理和格式化的其他Jav

    2024年02月09日
    浏览(46)
  • 处理大数据的基础架构,OLTP和OLAP的区别,数据库与Hadoop、Spark、Hive和Flink大数据技术

    2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其sql要学,当然,像很多金融企业、安全机构啥的,他们必须要用oracle数据库 这oracle比sql安全,强大多了,所以你需要学

    2024年02月08日
    浏览(57)
  • Spark 读写 es 数据(scala 版)

    读取 hdfs 文件 解析采用 fast-json : 1、 pom.xml 2、 main 文件 运行结果: 1、 pom.xml 2、 main 文件 参考文章 Spark读写ES数据时遇到的问题总结 Spark读写ES 使用Apache Spark将数据写入ElasticSearch

    2024年02月11日
    浏览(39)
  • Hadoop/Hive/Spark小文件处理

    小文件指的是文件size比HDFS的block size小很多的文件。Hadoop适合处理少量的大文件,而不是大量的小文件。 首先,在HDFS中,任何block,文件或者目录在内存中均以对象的形式存储,每个对象约占150byte,如果有1000 0000个小文件,每个文件占用一个block,则namenode大约需要2G空间。

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包