SparkSQL-对数据缺失和异常值进行处理

文章介绍了在SparkSQL中如何处理数据的缺失值和异常值,包括使用DataFrame的na.drop()、na.fill()和na.replace()方法进行丢弃、填充和替换。对于丢弃规则,可以按any或all条件删除行,也可指定列。填充规则支持对所有或特定列填充默认值。异常数据处理则涉及对特定值的替换,如将NaN替换为Double.NaN。
摘要由CSDN通过智能技术生成

缺失数据

准备数据

 处理方式

丢弃规则

填充规则

异常数据

 方法1:丢弃处理

 方法2:替换处理


缺失数据

准备数据

 处理方式

1、丢弃/过滤:DataFrame.na.drop()

2、填充:DataFrame.na.fill()

3、替换:DataFrame.na.replace()

丢弃规则

1、any 一行中有任何一个是NaN/null就丢弃

df.na.drop("any").show() //任何出现NaN/null就丢弃

2、all 只有一行中所有都是NaN/null才丢弃

df.na.drop("all").show() //一行都是NaN/null才丢弃

3、某些规则 针对某些列有NaN/null ,是否丢弃该列

df.na.drop("any",List("age","dt")).show() //针对特定列出现NaN/null就丢弃改行

填充规则

1、针对所有列进行默认填充

df.na.fill(0).show() //针对所有列都填充0

2、针对特定的列

df.na.fill(0,List("age","dt")).show() //针对特定列进行填充

异常数据

准备数据 

        方法1:丢弃处理

df2.where('dt =!= "NaN").show() //只获取dt列 =!=(不为)NaN的数据

        方法2:替换处理

        如果需要使用when 则需要导入functions的隐式转换操作 

    import org.apache.spark.sql.functions._

        1、直接替换

 df2.select( //如果dt等于NA就替换为Double类型的NaN(NA是字符串类型 NaN是double类型)
      when('age === "NA",Double.NaN)
        .otherwise('age cast DoubleType)//还需要统一该列其他的数据类型
        .as("ok") //指定为新的列名
    ).show()

         2、使用na.repalce替换 

repalce("指定列",Map("原始数据" -> "替换后的数据")) 进行替换但是Map替换的方式不能变

注意:Map()转换的时候原类型和转换后的类型必须是一致的 

df2.na.replace("dt",Map("NaN" -> "NA","Null" -> "null")).show()

代码: 

  def main(args: Array[String]): Unit = {
    //创建Session对象
    val spark = SparkSession
      .builder() //构建器
      .appName("sparkSQL") //序名称程
      .master("local[*]") //执行方式:本地
      .getOrCreate() //创建对象
    //导入转换
    import spark.implicits._
    //因为自定推断字段类型可能识别NAN为String类型,不方便处理,所以这里指定schema
    val schema: StructType = StructType(List(
      StructField("id", LongType),
      StructField("name", StringType),
      StructField("age", IntegerType),
      StructField("dt", DoubleType)
    ))
    schema
    //读取数据
      //因为数据中已有表头则设置option("header",true)
    val df: DataFrame = spark.read.option("header",true).schema(schema).csv("file:///D:\\spark.test\\datas\\a1.csv")
    //数据缺失处理
      //方式1:丢弃原则 any、all、自定义
    //df.na.drop("any").show() //任何出现NaN/null就丢弃
    //df.na.drop("all").show() //一行都是NaN/null才丢弃
    //df.na.drop("any",List("age","dt")).show() //针对特定列出现NaN/null就丢弃改行

      //方式2:填充
    //df.na.fill(0).show() //针对所有列都填充0
    //df.na.fill(0,List("age","dt")).show() //针对特定列进行填充

    //读取数据
    val df2: DataFrame = spark.read.option("header",true).csv("file:///D:\\spark.test\\datas\\a2.csv")
    //异常数据处理
      //1.丢弃处理
    //df2.where('dt =!= "NaN").show() //只获取dt列 =!=(不为)NaN的数据
      //2、替换处理
    import org.apache.spark.sql.functions._
        //直接替换
//    df2.select( //如果dt等于NA就替换为Double类型的NaN(NA是字符串类型 NaN是double类型)
//      when('age === "NA",Double.NaN)
//        .otherwise('age cast DoubleType)//还需要统一该列其他的数据类型
//        .as("ok") //指定为新的列名
//    ).show()

    //df2.na.replace("dt",Map("NaN" -> "NA","Null" -> "null")).show()
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

open_test01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值