数据操作——缺失值处理

news2025/1/16 12:50:50

缺失值处理

缺失值的处理思路

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

  • 什么是缺失值

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

    在这里插入图片描述

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

  • 缺失值如何产生的

    在这里插入图片描述

    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()
    }
    

    在这里插入图片描述

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

    • 丢弃包含 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()
    
    

    在这里插入图片描述

    在这里插入图片描述

    使用 where 直接过滤

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

    在这里插入图片描述

  • 所用文件

    [beijingpm_with_nan.rar]

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

  • 以上代码的前置条件

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1400921.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring成长之路—Spring MVC

在分享SpringMVC之前,我们先对MVC有个基本的了解。MVC(Model-View-Controller)指的是一种软件思想,它将软件分为三层:模型层、视图层、控制层 模型层即Model:负责处理具体的业务和封装实体类,我们所知的service层、poj…

智慧文旅一机游:科技与文化的完美结合,引领智慧文旅新潮流,智慧旅游未来已来

一、科技与文化的完美结合:智慧文旅一机游的核心理念 智慧文旅一机游,是科技与文化相融合的产物,它不仅代表着旅游行业的创新与发展,更是一种文化与科技完美结合的生活方式。一机游的核心理念在于通过先进的科技手段,提…

HttpServletRequest getServerPort()、getLocalPort() 、getRemotePort() 区别

getRemotePort() 、getServerPort()、getLocalPort() request.getServerPort()、request.getLocalPort() 和 request.getRemotePort() 这三个方法都是获取与HTTP请求相关的端口信息的 客户端(如浏览器)通过某个随机分配的网络连接端口(7070) 向服务器发送HTTP请求( http://exam…

Leetcode刷题笔记题解(C++):LCR 174. 寻找二叉搜索树中的目标节点

思路:二叉搜索树的中序遍历是有序的从大到小的,故得出中序遍历的结果,即要第cnt大的数为倒数第cnt的数 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeN…

嵌入式学习-网络编程-Day6

嵌入式学习-网络编程-Day6 一、思维导图 二、作业 1.基于UDP的网络聊天室(2024.1.21号前上交) 项目需求: 1.如果有用户登录,其他用户可以收到这个人的登录信息 2.如果有人发送信息,其他用户可以收到这个人的群聊信息…

读书笔记之《万物起源》:宇宙与人类的极简史

《万物起源:从宇宙大爆炸到文明的兴起》讲述了从大爆炸直到今日,约140亿年间所有重大事物的起源,依次覆盖了量子力学,天体物理学,化学,行星科学,地质学,生物学和人类历史等等学科。 …

Spring第七天(AOP)

简介 AOP(Aspect Oriented Programing)面向切面编程,一种编程范式,指导开发者如何组织程序结构 作用 在不惊动原始设计的基础上为其进行功能增强 Spring理念:无入侵式/无侵入式 基本概念 连接点(JoinPoint) : 程序执行过程中的任意位置&a…

Linux:软硬链接的概念与应用

文章目录 软链接和硬链接软链接的应用场景硬链接的应用场景当前目录和上级目录软硬链接目录和文件的问题 总结 本篇要探讨的主题是关于软硬链接的概念 在Linux系统链接文件中有两种,一种是硬链接,一种是软链接,那么本篇就基于上述的两种链接…

IDEA的database使用

一、数据据库 在使用database之前,首先你的电脑要安装好了数据库并且启动。 MySQL卸载手册 链接:https://pan.baidu.com/doc/share/AVXW5SG6T76puBOWnPegmw-602323264797863 提取码:hlgf MySQL安装图解 链接:https://pan.baidu.…

2024年,给程序员的六点建议

作为程序员,持续进步和发展是至关重要的。除了技术能力的提升,还有一些关键的行为和思维方式可以帮助工程师在职业生涯中取得更大的成功。本文将提供六个重要的建议,这些建议将帮助程序员在职业生涯中迈出成功的步伐。 走出舒适区 走出舒适区…

IEEE-2024年第五届人工智能、机器人及控制国际会议(AIRC 2024)

IEEE--2024年第五届人工智能、机器人及控制国际会议(AIRC 2024) 会议时间: 2024年4月22-24日 会议地点: 埃及开罗 埃及英国大学 会议网址:AIRC 2024 | Artificial Intelligence, Robotics and Controlhttps://www.airc.org/ 埃及开罗 埃及英国大学 会议组织单位: 征…

关于安装Dubbo+zookeeper过程中遇到的许多问题

在学习dubbozookeeper时安装启动dubbo-admin出现的一些问题: 首先我是跟着狂神安装zookeeper,基本下来没什么问题。然后就是安装dubbo-admin,狂神安装的是dubbo-admin-master,但是现在github上已经没有这个版本了,只能…

[小程序]Http网络请求

一、数据请求限制 出于安全性(bushi)考虑,小程序请求的数据接口必须具备以下两个条件: ①只能请求Https类型 ②必须将接口域名添加到信任列表中 1.配置request合法域名 配置步骤如下:小程序管理后台->开发->开发设置->服务器域名-&g…

“揭秘Maven:如何成为大数据项目的管理能手?“

介绍:Maven是一个项目管理和构建自动化工具,广泛应用于Java项目中。具体来说:项目对象模型(POM):Maven通过一个名为POM的模型来描述项目信息,包括项目的坐标、依赖关系、插件目标等。这个模型通…

从零开始的OpenGL光栅化渲染器构建5-阴影

前言 阴影是光线被阻挡的结果;当一个光源的光线由于其他物体的阻挡不能够达到一个物体的表面的时候,那么这个物体就在阴影中了。阴影能够使场景看起来真实得多,并且可以让观察者获得物体之间的空间位置关系。 直接阴影 阴影映射(Shadow Ma…

【转载】java面试题

java面试题大全 何为进程?何为线程?JVM拓展为什么程序计数器、虚拟机栈和本地方法栈是线程私有的呢?为什么堆和方法区是线程共享的呢虚拟机栈和本地方法栈为什么是私有的?一句话简单了解堆和方法区单核 CPU 上运行多个线程效率一定会高吗?创建线程有哪…

贝锐蒲公英云AP体验:云端快速部署、远程管理,轻松满足办公环境

公司原本的网络由于采用多个路由器,导致无线信号杂乱,管理不便,且远程办公体验较差,作为IT负责人的我,一直想寻找一个可以实现网络统一管理并有效提升远程工作便捷性的产品。 于是,我决定在公司内部部署贝…

使 a === 1 a === 2 a === 3 为 true 的几种“下毒“方法

前言 这算得上是近些年的前端网红题了,曾经对这种网红题非常抵触,认为非常没有意义。 看到了不少人有做分享,有各种各样的方案,有涉及到 JS 非常基础的知识点,也不得不感叹解题者的脑洞之大。 但是,拿来…

30、WEB攻防——通用漏洞SQL注入CTF二次堆叠DNS带外

文章目录 堆叠注入二次注入DNS注入 堆叠注入 堆叠注入:根据数据库类型决定是否支持多条语句执行,用分号隔开。堆叠注入在代码中被执行是一方面,是否被执行成功又是另一方面。支持数据库类型:Mysql、Mssql等。 在mysql中&#xf…

react 页签(自行封装)

思路:封装一个页签组件,包裹页面组件,页面渲染之后把数据缓存到全局状态实现页面缓存。 浏览本博客之前先看一下我的博客实现的功能是否满足需求,实现功能: - 页面缓存 - 关闭当前页 - 鼠标右键>关闭当前 - 鼠标右…