如何在pyspark数据框中返回具有Null值的行?

5

我试图从一个pyspark dataframe中获取具有null值的行。在pandas中,我可以使用dataframe的isnull()来实现:

df = df[df.isnull().any(axis=1)]

但是在 PySpark 中,当我运行下面的命令时,它会显示 Attributeerror:。
df.filter(df.isNull())

AttributeError: 'DataFrame'对象没有'isNull'属性。

如何在不检查每个列的情况下获取具有null值的行?


请参考以下链接:https://dev59.com/A1oU5IYBdhLWcg3wnoAP - Mikhail Berlinkov
@Mikhail 我认为所链接的问题不是答案,因为该问题要求同时检查所有列,而没有逐列检查。 - Amanda
2个回答

10

你可以使用wherereduce和列表生成式来筛选行。例如,给定以下数据框:

df = sc.parallelize([
    (0.4, 0.3),
    (None, 0.11),
    (9.7, None), 
    (None, None)
]).toDF(["A", "B"])

df.show()
+----+----+
|   A|   B|
+----+----+
| 0.4| 0.3|
|null|0.11|
| 9.7|null|
|null|null|
+----+----+

使用以下代码可以过滤掉具有某些 null 值的行:

import pyspark.sql.functions as f
from functools import reduce

df.where(reduce(lambda x, y: x | y, (f.col(x).isNull() for x in df.columns))).show()

这意味着:

+----+----+
|   A|   B|
+----+----+
|null|0.11|
| 9.7|null|
|null|null|
+----+----+
在条件语句中,您必须指定任何(或者,|)、全部(和,&)等。

好的回答,我在想如何以编程方式构建布尔表达式。 - information_interchange

0

这是在Scala中实现此操作的方法

import org.apache.spark.sql.functions._

case class Test(id:Int, weight:Option[Int], age:Int, gender: Option[String])

val df1 = Seq(Test(1, Some(100), 23, Some("Male")), Test(2, None, 25, None), Test(3, None, 33, Some("Female"))).toDF()
    
display(df1.filter(df1.columns.map(c => col(c).isNull).reduce((a,b) => a || b)))

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