Pyspark Dataframe使用UDF加入

Joh*_*ohn 4 python user-defined-functions apache-spark apache-spark-sql pyspark

我正在尝试在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))
Run Code Online (Sandbox Code Playgroud)

我得到的错误信息是:

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

有没有办法编写可以处理来自两个独立数据帧的列的PySpark UDF?

zer*_*323 11

Spark 2.2+

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

df1.crossJoin(df2).where(my_join_udf(df1.col_a, df2.col_b))
Run Code Online (Sandbox Code Playgroud)

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))
Run Code Online (Sandbox Code Playgroud)

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