In einem Datenframe versuche ich diejenigen Zeilen zu identifizieren, die einen Wert in Spalte C2 haben, der in Spalte C1 in keiner anderen Zeile existiert. Ich habe versucht den folgenden Code:Warum left_anti Join funktioniert nicht wie erwartet in Pyspark?
in_df = sqlContext.createDataFrame([[1,None,'A'],[2,1,'B'],[3,None,'C'],[4,11,'D']],['C1','C2','C3'])
in_df.show()
+---+----+---+
| C1| C2| C3|
+---+----+---+
| 1|null| A|
| 2| 1| B|
| 3|null| C|
| 4| 11| D|
+---+----+---+
filtered = in_df.filter(in_df.C2.isNotNull())
filtered.show()
+---+---+---+
| C1| C2| C3|
+---+---+---+
| 2| 1| B|
| 4| 11| D|
+---+---+---+
nun eine left_anti Anwendung join nur die Zeile 4 zurück erwartet wird, aber auch erhalte ich Zeile 2:
filtered.join(in_df,(in_df.C1 == filtered.C2), 'left_anti').show()
+---+---+---+
| C1| C2| C3|
+---+---+---+
| 2| 1| B|
| 4| 11| D|
+---+---+---+
Wenn ich ‚materialisieren‘ das gefilterte DF die Ergebnis ist wie erwartet:
filtered = filtered.toDF(*filtered.columns)
filtered.join(in_df,(in_df.C1 == filtered.C2), 'left_anti').show()
+---+---+---+
| C1| C2| C3|
+---+---+---+
| 4| 11| D|
+---+---+---+
Warum wird diese .toDF benötigt?
Ihre Antwort erklärt sehr gut, was bei meinem ersten Versuch schief gelaufen ist. Mein zweiter Versuch nach dem Anwenden von 'filtered = filtered.toDF' auf den identisch codierten Join scheint jedoch kein Problem zu haben, zwischen linken und rechten Spalten zu unterscheiden. Warum das? – heinzK