Pyspark Dataframe Join usando UDF

Estoy intentando crear una unión personalizada para dos marcos de datos (df1 y df2) en PySpark (similar a esto ), con un código que se parece a esto:

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

El mensaje de error que estoy recibiendo es:

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

¿Hay una manera de escribir un UDF de PySpark que pueda procesar columnas de dos marcos de datos separados?

Spark 2.2+

Tienes que usar crossJoin o habilitar las combinaciones cruzadas en la configuración :

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

Chispa 2.0, 2.1

El método que se muestra a continuación ya no funciona en Spark 2.x. Ver SPARK-19728 .

Chispa 1.x

Teóricamente puedes unirte y filtrar:

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

Pero en general no deberías hacerlo todo. Cualquier tipo de join que no se base en la igualdad requiere un producto cartesiano completo (igual que la respuesta) que rara vez es aceptable (ver también ¿Por qué usar un UDF en una consulta SQL conduce al producto cartesiano? ).