Pyspark 对列列表应用条件的数据帧筛选

Pyspark 对列列表应用条件的数据帧筛选,pyspark,databricks,Pyspark,Databricks,如果列表中的任何字符串列为空,我想筛选pyspark数据帧 df = df.where(all([col(x)!='' for x in col_list])) ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions. 您可以使用functools中的red

如果列表中的任何字符串列为空,我想筛选pyspark数据帧

df = df.where(all([col(x)!='' for x in col_list]))

ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.

您可以使用
functools
中的
reduce
来模拟
all
,如下所示

from functools import reduce

spark_df.where(reduce(lambda x, y: x & y,  (F.col(x) != '' for x in col_list))).show()
由于
过滤器
(或
其中
)是延迟计算的转换,我们可以通过逐个应用它们来合并多个条件,例如

for c in col_list:
    spark_df = spark_df.filter(col(c) != "")

spark_df.show()
这可能更具可读性,但最终将以与Sreeram的答案完全相同的方式执行

另一方面,删除带有空值的行最常用的方法是

df.na.drop(how="any", subset=col_list)
但它只处理缺少的(null/None)值,而不是空字符串