Pyspark Dataframe使用UDF联接



我正试图在PySpark中为两个数据帧(df1和df2)创建一个自定义联接(类似于此),代码如下:

my_join_udf = udf(lambda x, y: isJoin(x, y), BooleanType())
my_join_df = df1.join(df2, my_join_udf(df1.col_a, df2.col_b))

我得到的错误信息是:

java.lang.RuntimeException: Invalid PythonUDF PythonUDF#<lambda>(col_a#17,col_b#0), requires attributes from more than one child

有没有一种方法可以编写一个PySpark UDF,它可以处理来自两个独立数据帧的列?

Spark 2.2+

您必须使用crossJoin或在配置中启用交叉联接:

df1.crossJoin(df2).where(my_join_udf(df1.col_a, df2.col_b))

Spark 2.0、2.1

下面显示的方法在Spark 2.x中不再有效。请参阅Spark-19728。

Spark 1.x

理论上你可以加入并过滤:

df1.join(df2).where(my_join_udf(df1.col_a, df2.col_b))

但总的来说,你不应该全部都去。任何不基于等式的类型的join都需要一个完全的笛卡尔乘积(与答案相同),这是很少可接受的(另请参阅为什么在SQL查询中使用UDF会导致笛卡尔乘积?)。

相关内容

  • 没有找到相关文章

最新更新