在整行上使用udf过滤Pyspark Dataframe

时间:2018-08-28 07:07:31

标签: pyspark apache-spark-sql user-defined-functions

是否可以将整行选择为一列以输入到Pyspark过滤器udf中?

我有一个复杂的过滤功能“ my_filter”,我想将其应用于整个DataFrame:

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

但是

col("*")

引发错误,因为这不是有效的操作。

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

1 个答案:

答案 0 :(得分:5)

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

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()

产生相同的输出。