Spark DataFrame中na.drop()、drop()、filter(col.isNotNull())、filter(col.isNull())区别

@Author  : Spinach | GHB
@Link    : http://blog.csdn.net/bocai8058


前言

在spark应用开发中,会遇到NULL值(具体含义如下)的现象,而这些数据被认为是脏数据,需要被清洗。本节会讲解几种方法用以剔除存在NULL值。

  • Nothing是所有类型的子类,它没有对象,但是可以定义类型,如果一个类型抛出异常,那这个返回值类型就是Nothing;
  • Null是AnyRef的子类(引用类型),null是Null唯一的对象;
  • None是Option的一个子类,一个Some集合,一个None,如果Option中没有值,则返回None;
  • Nil是一个空List,定义为List[Nothing],所有Nil是所有List[T]的子类;

测试案例

implicit lazy val spark: SparkSession = initSparkSession()
import spark.implicits._
val list: List[(String, String, String)] = List(
       ("john", "20", ""),
       ("daniel", "29", "80"),
       ("alex", "23", null),
       ("ken", null, null),
       (null, null, null),
       ("jack", "78", "null")
     )
val testDataDF: DataFrame = spark.sparkContext.parallelize(list).map(x => (x._1, x._2, x._3)).toDF("name", "age", "scores")
testDataDF.show(false)
nameagescores
john20
daniel2980
alex23null
kennullnull
nullnullnull
jack78null(此为字符串"null")

drop()

dataframe.drop是直接调用的dataset中drop接口。

  • testDataDF.drop().show(false) 如果不传递列名,不会做任何操作
nameagescores
john20
daniel2980
alex23null
kennullnull
nullnullnull
jack78null(此为字符串"null")
  • testDataDF.drop("scores").show(false) 删除指定列scores列的数据,不管有没有NULL值
nameage
john20
daniel29
kennull
nullnull
jack78

na.drop()

删除DataFrame中含有NULL值的行数据。利用dataframe.na可得到一个DataframeNaFunctions类型变量,然后利用该变量可调用DataframeNaFunctions中drop接口。

  • testDataDF.na.drop().show(false) 会剔除所在null值的行数据
nameagescores
john20
daniel2980
jack78null(此为字符串"null")

filter(col.isNull())

过滤出指定列里含有null值的所有行数据。

  • testDataDF.filter(testDataDF.col("scores").isNull).show(false) 会选择出scores列里含有null值的所有行数据
nameagescores
alex23null
kennullnull
nullnullnull
  • testDataDF.filter(testDataDF.col("age").isNull).show(false) 会选择出scores列里含有null值的所有行数据
nameagescores
kennullnull
nullnullnull

filter(col.isNotNull())

过滤出指定列里不含有null值的所有行数据。

  • testDataDF.filter(testDataDF.col("scores").isNotNull).show(false) 会选择出scores列里不含有null值的所有行数据
nameagescores
john20
daniel2980
jack78null(此为字符串"null")
  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值