使用整行上的udf筛选Pyspark数据帧

使用整行上的udf筛选Pyspark数据帧,pyspark,apache-spark-sql,user-defined-functions,Pyspark,Apache Spark Sql,User Defined Functions,有没有办法选择整行作为列输入Pyspark筛选器udf 我有一个复杂的过滤函数“my_filter”,我想应用于整个数据帧: my_filter_udf = udf(lambda r: my_filter(r), BooleanType()) new_df = df.filter(my_filter_udf(col("*")) 但是 引发错误,因为该操作无效 我知道我可以将数据帧转换为RDD,然后使用RDD的filter方法,但我不想将其转换为RDD,然后再转换回数据帧。我的DataFrame

有没有办法选择整行作为列输入Pyspark筛选器udf

我有一个复杂的过滤函数“my_filter”,我想应用于整个数据帧:

my_filter_udf = udf(lambda r: my_filter(r), BooleanType())
new_df = df.filter(my_filter_udf(col("*"))
但是

引发错误,因为该操作无效


我知道我可以将数据帧转换为RDD,然后使用RDD的filter方法,但我不想将其转换为RDD,然后再转换回数据帧。我的DataFrame具有复杂的嵌套类型,因此当我再次尝试将RDD转换为DataFrame时,模式推断失败。

您应该静态地写入所有列。例如:

from pyspark.sql import functions as F

# create sample df
df = sc.parallelize([
     (1, 'b'),
     (1, 'c'),

 ]).toDF(["id", "category"])

#simple filter function
@F.udf(returnType=BooleanType())
def my_filter(col1, col2):
    return (col1>0) & (col2=="b")

df.filter(my_filter('id', 'category')).show()
结果:

+---+--------+
| id|category|
+---+--------+
|  1|       b|
+---+--------+
如果您有这么多列,并且您确定列的顺序:

cols = df.columns
df.filter(my_filter(*cols)).show()

产生相同的输出。

感谢您提供了这个干净的解决方案,但是如果我们有很多列,我们就不能这样做。我使用的是100列的数据帧。你能帮我拿那个箱子吗。
cols = df.columns
df.filter(my_filter(*cols)).show()