@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)
name |
age |
scores |
john |
20 |
|
daniel |
29 |
80 |
alex |
23 |
null |
ken |
null |
null |
null |
null |
null |
jack |
78 |
null(此为字符串"null") |
drop()
dataframe.drop是直接调用的dataset中drop接口。
testDataDF.drop().show(false)
如果不传递列名,不会做任何操作
name |
age |
scores |
john |
20 |
|
daniel |
29 |
80 |
alex |
23 |
null |
ken |
null |
null |
null |
null |
null |
jack |
78 |
null(此为字符串"null") |
testDataDF.drop("scores").show(false)
删除指定列scores列的数据,不管有没有NULL值
name |
age |
john |
20 |
daniel |
29 |
ken |
null |
null |
null |
jack |
78 |
na.drop()
删除DataFrame中含有NULL值的行数据。利用dataframe.na可得到一个DataframeNaFunctions类型变量,然后利用该变量可调用DataframeNaFunctions中drop接口。
testDataDF.na.drop().show(false)
会剔除所在null值的行数据
name |
age |
scores |
john |
20 |
|
daniel |
29 |
80 |
jack |
78 |
null(此为字符串"null") |
filter(col.isNull())
过滤出指定列里含有null值的所有行数据。
testDataDF.filter(testDataDF.col("scores").isNull).show(false)
会选择出scores列里含有null值的所有行数据
name |
age |
scores |
alex |
23 |
null |
ken |
null |
null |
null |
null |
null |
testDataDF.filter(testDataDF.col("age").isNull).show(false)
会选择出scores列里含有null值的所有行数据
name |
age |
scores |
ken |
null |
null |
null |
null |
null |
filter(col.isNotNull())
过滤出指定列里不含有null值的所有行数据。
testDataDF.filter(testDataDF.col("scores").isNotNull).show(false)
会选择出scores列里不含有null值的所有行数据
name |
age |
scores |
john |
20 |
|
daniel |
29 |
80 |
jack |
78 |
null(此为字符串"null") |