数据操作——缺失值处理

缺失值处理

缺失值的处理思路

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

  • 什么是缺失值

    一个值本身的含义是这个值不存在则称之为缺失值, 也就是说这个值本身代表着缺失, 或者这个值本身无意义, 比如说 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 ,不要自动推断// 创建 Schemaval schema = StructType(List(StructField("id", LongType),StructField("year", IntegerType),StructField("month", IntegerType),StructField("day", IntegerType),StructField("session", IntegerType),StructField("pm", DoubleType)))// Double.NaNval sourceDF = spark.read.option("header",true).schema(schema).csv("./dataset/beijingpm_with_nan.csv") // pm下的NaN 自动转为 Double.NaNsourceDF.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...// elseimport 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.rhkb.cn/news/243281.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hylicos - MINI2440 - 中断控制

中断 中断源管理 中断是一种异步异常,CPU需要处理很多来自设备的中断请求,而CPU引出的line只有IRQ线和FIQ线,所以就得引入中断控制器帮助CPU搞清楚是中断的来源。 MINI2440的中断控制器,可以接受来自60个中断源的请求。提供这些…

MySQL面试总结

MySQL优化 1.MySQL如何定位慢查询 1.1开源工具 1.2MySQL自带慢日志 1.3解答 2.EXPLAIN 2.1解答 3.什么是索引 4.B树 4.1数据结构对比 5.聚簇索引(聚集索引) 6.覆盖索引 7.索引创建原则 8.什么情况下索引失效 9.你对sql优化经验 10.事务 11.MVCC 11.主从…

开源堡垒机JumpServer本地安装并配置公网访问地址

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机,是符合 4A 规范的专业运维安全审计系统。JumpS…

Python多线程爬虫——数据分析项目实现详解

前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z 「个人网站」:雪碧的个人网站 ChatGPT体验地址 文章目录 前言爬虫获取cookie网站爬取与启动CS…

Spring boot项目java bean和xml互转

Spring boot项目实现java bean和xml互转 项目场景:互转方法使用jackson进行互转使用jaxws进行xml与bean的互转 搞定收工! 项目场景: 工作中需要给下游第三方收费系统做数据挡板,由于下游系统使用的是soap webservice,里面涉及各种…

牛客周赛 Round 21 解题报告 | 珂学家 | 堆栈的妙用

前言 整体评价 从A题中的Baidu, 可以猜到这场有几道题来自于百度校招。 其实B题有点意思,如果把十字星的范围放大,那就可以成为一个hard题。 D题也挺意思的,大概有两种思路,一种是从左到右枚举右端点,增量累加&…

【C/C++】C/C++编程——为什么学习 C++?

当提到C的时候,很多人会觉得语法复杂、学习曲线陡峭,并且好像与C语言还有点"纠缠不清"。尽管如此,C仍然是当今世界上最受欢迎和最有影响力的编程语言之一。特别是在当今快速发展的人工智能(AI)领域&#xff…

利用GPU加速自定义风格图像生成-利用GPU加速结合了ControlNet/ Lora的Stable Diffusion XL

点击链接完成注册,参加本次在线研讨会 https://www.nvidia.cn/webinars/sessions/?session_id240124-31319 随着AI技术的发展, 数字内容创建业务也变得越来越火热。生成式AI模型的发布, 让我们看到了人工智能在各行各业的潜力。您只需要用语言简单描述自己希望看…

黑马苍穹外卖学习Day10

文章目录 Spring Task介绍cron表达式入门案例 订单状态定时处理需求分析代码开发功能测试 WebSocket介绍入门案例 来单提醒需求分析代码开发 客户催单需求分析代码开发 Spring Task 介绍 cron表达式 入门案例 订单状态定时处理 需求分析 代码开发 新建一个task包里面编写代码…

REVIT二次开发批量编号

步骤1 步骤2 步骤3 实现代码using System; using System.Collections.Generic; using System.Linq; using Syste

《Python数据分析技术栈》第03章 03 可视化各级数据(Visualizing various levels of data)

03 可视化各级数据(Visualizing various levels of data) 《Python数据分析技术栈》第03章 03 可视化各级数据(Visualizing various levels of data) Whenever you need to analyze data, first understand if the data is stru…

C++三剑客之std::variant(二):深入剖析

目录 1.概述 2.辅助类介绍 2.1.std::negation 2.2.std::conjunction 2.3.std::is_destructible 2.4.std::is_object 2.5.is_default_constructible 2.6.std::is_trivially_destructible 2.7.std::in_place_type和std::in_place_index 3.原理分析 3.1.存储分析 3.2.…

【蓝桥杯EDA设计与开发】资料汇总以及立创EDA及PCB相关技术资料汇总(持续更新)

[18/01/2024]:目前为了准备蓝桥杯做一些资料贴,于是写下这一篇博客。 各种资料均来源于网络以及部分书籍、手册等文档,参考不保证其准确性。 如果在准备蓝桥杯,可与我私信共同学习!!!&#xf…

SCTP, TCP, UDP, IP, ICMP都在哪一层?(TCP/IP网络通信协议学习)

TCP/IP网络通信协议最早是由罗伯特卡恩(Robert E. Kahn)和文顿瑟夫(Vinton G. Cerf)于1972年提出的,它是一个实际的协议栈。 OSI七层网络通信协议最早是由国际标准化组织(ISO)于1977年提出的&am…

0基础转行做软件测试?一文教小白拿到初级岗位offer?

我认为入门软件测试需要四个方面的知识or技能,它们是:业务知识、职业素养、基础知识、技术知识。 职业素养是一切的根基,因为人在职场就必须拥有必要的职业素养,软件测试工程师也不例外。基础知识和技术知识是两大支柱&#xff0…

Kubernetes网络模型概述

Kubernetes网络模型设计的一个基础原则是:每个Pod都拥有一个独立的IP地址,并假定所有Pod都在一个可以直接连通的、扁平的网络空间中。所以不管这些Pod是否运行在同一个Node中,都要求它们可以直接通过对方的IP进行访问。由于Kubernetes的网络模…

分布式锁的产生以及使用

日常开发中,针对一些需要锁定资源的操作,例如商城的订单超卖问题、订单重复提交问题等。 都是为了解决在资源有限的情况限制客户端的访问,对应的是限流。 单节点锁问题 目前针对这种锁资源的情况采取的往往是互斥锁,例如 java 里…

顶顶通用户申请和安装 空号识别 模块流程

一、申请 空号识别 授权 打开网址:http://my.ddrj.com,注册并登录。 点击“我的授权” -> “申请授权” (根据负责人的要求选择“在线”或是“离线”)。 找到名称为空号识别的授权并点击“加号”图标打开授权,然…

Uni-App三甲医院、医保定点三甲医院在线预约挂号系统源码

医院在线预约挂号系统是一种方便患者预约挂号的系统,患者可以通过该系统进行预约挂号,省去了到医院现场排队等待的时间,提高了就诊效率。随着医院信息化水平的不断发展,医院在线预约挂号管理系统已成为医院管理中不可或缺的一部分…

SQL-窗口函数

什么是窗口函数 可以像聚合函数一样对一组数据进行分析并返回结果,二者的不同之处在于,窗口函数不是将一组数据汇总成单个结果,而是为每一行数据都返回一个结果。 窗口函数组成部分 1.创建数据分区 窗口函数OVER子句中的PARTITION BY选项用…