2016-07-20 15 views
3

Ich versuche, für zwei Datenrahmen (DF1 und DF2) in PySpark (ähnlich this), einen benutzerdefinierten verbinden mit dem Code zu erstellen, die wie folgt aussehen:Pyspark Datenrahmen Join UDF mit

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

Die Fehlermeldung ich erhalte ist:

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

gibt es eine Möglichkeit, eine PySpark UDF zu schreiben, die Spalten aus zwei separaten Datenrahmen verarbeiten kann?

Antwort

5

Funken 2.2+

Sie haben crossJoin zu verwenden oder aktivieren Kreuz verbindet in the configuration:

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

Spark-2.0, 2,1

Methode unten in nicht mehr gezeigt arbeiten Funken 2.x. Siehe SPARK-19728.

Spark-1.x

Theoretisch können Sie verbinden und Filter:

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

aber im Allgemeinen sollte man nicht zu allem. Jede Art von join, die nicht auf Gleichheit basiert, erfordert ein vollständiges kartesisches Produkt (wie die Antwort), das selten akzeptabel ist (siehe auch Why using a UDF in a SQL query leads to cartesian product?).

Verwandte Themen