如何在pyspark(spark)中从DF获取包含值None的行

mar*_*oss 8 python apache-spark pyspark

在下面的示例中,df.a == 1谓词返回正确的结果,但df.a == None在返回1时返回0.

l = [[1], [1], [2], [2], [None]]
df = sc.parallelize(l).toDF(['a'])
df    # DataFrame[a: bigint]
df.collect()    # [Row(a=1), Row(a=1), Row(a=2), Row(a=2), Row(a=None)]
df.where(df.a == 1).count()   # 2L
df.where(df.a == None).count()   # 0L
Run Code Online (Sandbox Code Playgroud)

使用Spark 1.3.1

zer*_*323 19

你可以使用Column.isNull方法:

df.where(df.a.isNull()).count()
Run Code Online (Sandbox Code Playgroud)

另一方面,这种行为是人们对普通SQL查询的期望.由于NULL标记"缺少信息和不适用的信息" [1],因此询问某些内容是否相等是没有意义的NULL.它只是IS或者IS NOT缺失.

Scala API提供了特殊的null-safe等号<=>运算符,因此可以执行以下操作:

df.where($"a" <=> lit(null))
Run Code Online (Sandbox Code Playgroud)

但如果你问我,这看起来不是一个好主意.

1. 维基百科,Null(SQL)

  • 如果任何列为空,是否有办法过滤行? (3认同)