我正在尝试从pyspark数据框中获取具有空值的行。在熊猫中,我可以在数据帧上使用isnull()
来实现这一点:
df = df[df.isnull().any(axis=1)]
但是在PySpark的情况下,当我在以下命令下运行时,它会显示Attributeerror:
df.filter(df.isNull())
AttributeError:“ DataFrame”对象没有属性“ isNull”。
如何在不检查每一列的情况下获取具有空值的行?
答案 0 :(得分:2)
您可以使用where
,reduce
和列表理解来过滤行。例如,给定以下数据框:
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|
+----+----+
在条件语句中,您必须指定是否有(或| |),所有(和&&)等。
答案 1 :(得分: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)))