Pyspark数据框使用UDF进行连接

6

我正在尝试使用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,可以处理来自两个不同数据框的列?
1个回答

14

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会导致笛卡尔积?)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接