我正在尝试在PySpark中创建两个数据帧(df1和df2)的自定义连接(类似于this),代码如下所示:
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 回答
Spark 2.2+
您必须使用crossJoin或启用交叉连接in the configuration:
Spark 2.0, 2.1
下面显示的方法在Spark 2.x中不再起作用 . 见SPARK-19728 .
Spark 1.x
从理论上讲,您可以加入并过滤:
但总的来说,你不应该这一切 . 任何不基于相等的
join
都需要完整的笛卡尔积(与答案相同),这是很难接受的(另见Why using a UDF in a SQL query leads to cartesian product?) .