我对pyspark和使用Dataframe是个新手,我要做的是获得所有值为Null的列的子集.
我在网上看到的大多数示例都显示了特定列上的筛选函数.是否可以筛选整个数据框并显示包含至少1个空值的所有行?
我对pyspark和使用Dataframe是个新手,我要做的是获得所有值为Null的列的子集.
我在网上看到的大多数示例都显示了特定列上的筛选函数.是否可以筛选整个数据框并显示包含至少1个空值的所有行?
如果您不关心哪些列为空,则可以使用循环来创建过滤条件:
from pyspark.sql import SparkSession
from pyspark.sql import functions as func
q1_df = spark\
.createDataFrame([(None, 1, 2), (3, None, 4), (5, 6, None), (7, 8, 9)],
['a', 'b', 'c'])
q1_df.show(5, False)
+----+----+----+
|a |b |c |
+----+----+----+
|null|1 |2 |
|3 |null|4 |
|5 |6 |null|
|7 |8 |9 |
+----+----+----+
condition = (func.lit(False))
for col in q1_df.columns:
condition = condition | (func.col(col).isNull())
q1_df.filter(condition).show(3, False)
+----+----+----+
|a |b |c |
+----+----+----+
|null|1 |2 |
|3 |null|4 |
|5 |6 |null|
+----+----+----+
当您要查找任何一列为空的行时,可以使用OR条件.
编辑时间:2022-08-01
我之所以首先将条件声明为func.lit(False)
,只是为了简化我的代码,只是想创建一个"base"条件.事实上,这个过滤器在这个过滤器中没有任何用处.当您判断condition
时,您将看到:
Column<'(((false OR (a IS NULL)) OR (b IS NULL)) OR (c IS NULL))'>
事实上,你可以使用其他方法来创造条件.例如:
for idx, col in enumerate(q1_df.columns):
if idx == 0:
condition = (func.col(col).isNull())
else:
condition = condition | (func.col(col).isNull())
condition
Column<'(((a IS NULL) OR (b IS NULL)) OR (c IS NULL))'>
或者,如果要过滤掉所有列中BOTH非NULL的行,在我的代码中,我将:
condition = (func.lit(True))
for col in q1_df.columns:
condition = condition & (func.col(col).isNotNull())
只要你可以创建所有的过滤条件,你就可以消除func.lit(False)
.只想提醒一下,如果您像我一样创建"base"条件,请不要使用如下所示的python内置bool类型,因为它们不是同一类型(boolean
比spark column
):
condition = False
for col in q1_df.columns:
condition = condition | (func.col(col).isNull())