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

How to get rows from DF that contain value None in pyspark (spark)

在下面的示例中,df.a == 1 谓词 return 是正确的结果,但是 df.a == None return 应该是 0 return 1.

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

使用 Spark 1.3.1

可以使用Column.isNull方法:

df.where(df.a.isNull()).count()

附带说明一下,这种行为是人们对 normal SQL query 的期望。由于 NULL 标记 "missing information and inapplicable information" [1],因此询问某物是否等于 NULL 是没有意义的。它只是缺少 ISIS NOT。\

Scala API 提供特殊的空安全相等 <=> 运算符,因此可以执行如下操作:

df.where($"a" <=> lit(null))

但如果你问我,这似乎不是个好主意。

1.Wikipedia, Null (SQL)