如何在pyspark(spark)中获取包含值“None”的数据框行。

10
在下面的例子中,df.a == 1谓词返回正确的结果,但是df.a == None返回0,而应该返回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

1个回答

22

您可以使用Column.isNull方法:

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

顺便提一下,这种行为是人们可以从普通的SQL查询中期望的。由于NULL表示"缺失信息和不适用信息" [1],所以询问某些东西是否等于NULL没有意义。它只是ISIS NOT缺失而已。

Scala API提供了特殊的空安全等号<=>运算符,因此可以做类似于这样的事情:

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

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

1. 维基百科,Null (SQL)


很棒的答案,各位。我知道这里的问题是关于pyspark的特定问题,但我认为也许加入如何在Scala中解决类似逻辑可能也不会有害,例如: df.filter(df.col("a").isNull() or df.col("a").isNaN() ).count() 我希望这有帮助。 - Pramit
4
如何筛选出任意一列为空的行? - information_interchange

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接