2016-06-06 3 views
4

Ich versuche, Werte in einer Spark-Dataframe-Spalte basierend auf Werten in einer anderen Dataframe-Spalte zu deduplizieren. Es scheint, dass withColumn() nur innerhalb eines einzigen Datenrahmens funktioniert, und Unterabfragen werden erst in Version 2 vollständig verfügbar sein. Ich denke, ich könnte versuchen, den Tabellen beizutreten, aber das scheint ein bisschen unordentlich. Hier ist die allgemeine Idee:Spark Deduplicate-Spalte im Datenframe basierend auf Spalte in anderen Datenrahmen

df.take(1) 
[Row(TIMESTAMP='20160531 23:03:33', CLIENT ID=233347, ROI NAME='my_roi', ROI VALUE=1, UNIQUE_ID='173888')] 

df_re.take(1) 
[Row(UNIQUE_ID='6866144:ST64PSIMT5MB:1')] 

Im Grunde nur die Werte von df nehmen mag, und entfernen Sie alle, die in df_re gefunden werden und dann wieder den gesamten Datenrahmen mit den Zeilen, diese Duplikate entfernt enthalten. Ich bin mir sicher, dass ich jedes einzelne wiederholen könnte, aber ich frage mich, ob es einen besseren Weg gibt. Irgendwelche Ideen?

Antwort

6

Der Weg, dies zu tun, ist eine left_outerjoin, und dann für wo die rechte Seite des Joins leer ist zu filtern. Etwas wie:

val df1 = Seq((1,2),(2,123),(3,101)).toDF("uniq_id", "payload") 
val df2 = Seq((2,432)).toDF("uniq_id", "other_data") 

df1.as("df1").join(
    df2.as("df2"), 
    col("df1.uniq_id") === col("df2.uniq_id"), 
    "left_outer" 
).filter($"df2.uniq_id".isNull) 
Verwandte Themen