Python Pyspark:基于列名列表筛选数据帧

Python Pyspark:基于列名列表筛选数据帧,python,dataframe,apache-spark,pyspark,apache-spark-sql,Python,Dataframe,Apache Spark,Pyspark,Apache Spark Sql,我正在寻找一种干净的方法来解决以下问题:我想过滤一个数据帧,使其只包含至少有一个值填充到预定义列名列表中的行 我不想单独列出所有条件,如下所示: df.where(col('col1').isNotNull() | col('col2').isNotNull() | ...) 这种方法是不可行的,因为列名列表可能会变得相当大,并且可能会经常更改 我现在的解决方案是在一个单独的函数中组合条件: def compose_condition(col_names): condition = Fa

我正在寻找一种干净的方法来解决以下问题:我想过滤一个数据帧,使其只包含至少有一个值填充到预定义列名列表中的行

我不想单独列出所有条件,如下所示:

df.where(col('col1').isNotNull() | col('col2').isNotNull() | ...)
这种方法是不可行的,因为列名列表可能会变得相当大,并且可能会经常更改

我现在的解决方案是在一个单独的函数中组合条件:

def compose_condition(col_names):
   condition = False
   for col_name in col_names:
      condition = condition | col(col_name).isNotNull()
   return condition
然后使用此函数的结果作为过滤条件:

my_col_names = ['col1', 'col2', 'col3']
df.where(compose_condition(my_col_names))
from functools import reduce
from pyspark.sql.functions import col

df.where(reduce(lambda a, b: a.isNotNull() | b.isNotNull(), map(col, my_col_names)))

我的解决方案还有其他选择吗?

如果指定子集中的所有列都为空,则可以使用
dropna
并指定
how='all'
删除行:

df2 = df.dropna(how='all', subset=my_col_names)

如果指定子集中的所有列都为空,则可以使用
dropna
并指定
how='all'
删除行:

df2 = df.dropna(how='all', subset=my_col_names)

您还可以使用python
functools.reduce
将列名列表缩减为筛选条件:

my_col_names = ['col1', 'col2', 'col3']
df.where(compose_condition(my_col_names))
from functools import reduce
from pyspark.sql.functions import col

df.where(reduce(lambda a, b: a.isNotNull() | b.isNotNull(), map(col, my_col_names)))

您还可以使用python
functools.reduce
将列名列表缩减为筛选条件:

my_col_names = ['col1', 'col2', 'col3']
df.where(compose_condition(my_col_names))
from functools import reduce
from pyspark.sql.functions import col

df.where(reduce(lambda a, b: a.isNotNull() | b.isNotNull(), map(col, my_col_names)))