2017-02-22 1 views
0

Angenommen, ich habe zwei Datenrahmen, df1 und df2. Sowohl df1 als auch df2 enthält die Spalte "id". Ich möchte df1, so dass die resultierende df filtern, df1prime, hatSpark: Wie filtert man Zeilen ohne Joins?

  • nur die gefundenen ids in df1
  • keine der alle in df2, gefunden ids

Ohne Joins zu verwenden. Wie kann ich das machen? Wird die Rückkehr zu RDDs anstelle von DFs helfen? Beide pyspark und scala Antworten sind willkommen.

Danke!

Edit: Ich mag die ganzen Zeilen halten von DF1

+0

Was ist los mit Joins? siehe [hier] (http://stackoverflow.com/questions/42351669/how-to-filter-duplicate-records-having-multiple-key-in-spark-dataframe/) – mtoto

+0

Nichts speziell falsch mit Joins, aber ich würde Suchen Sie nach einer günstigeren Operation – tohweizhong

+0

ein Anti-Join wird die billigste Operation sein, wenn Sie Datenrahmen haben, wenn Sie mit 'rdd's arbeiten wollen, können Sie' cougroup() 'und dann filtern. – mtoto

Antwort

0

Wenn Sie wirklich nur die IDs in Ihrem df1prime wollen (wie Sie in Ihrer Frage angeben), dann können Sie einfach tun (scala):

val df1primeIDs = df1.select($"id").except(df2.select($"id")) 

Wenn Sie die ganzen Spalten von df1 benötigen, ohne eine Verknüpfung, ich sehe keine andere Möglichkeit, als (mit meiner Linie über und unter der Annahme, dass id vom Typ long ist):

val df1prime = df1.where($"id".isin(
    df1primeIDs.collect().map(_.getLong(0)):_*) 
) 

Aber normalerweise Sammlung ist keine Option ...

+0

Ah ich möchte immer noch alle Spalten in df1 haben. Sammeln wäre sehr teuer .. – tohweizhong