2017-09-01 1 views
0

Ich habe zwei Scala-Datenframes. Trotz nach dem Beispiel gegeben here, bekomme ich noch DuplikateScala: DataFrame.join immer noch Duplikate

+----+----+----+-------+ 
    | b1| b2| b3|$$RowId| 
    +----+----+----+-------+ 
    |a1-1|a2-1|a3-1|  1| 
    |a1-2|a2-2|a3-2|  2| 
    |a1-3|a2-3|a3-3|  3| 
    |null|null|null|  8| 
    |null|null|null|  9| 
    |null|null|null|  10| 
    +----+----+----+-------+ 

    +-------+-----+-----+-----+ 
    |$$RowId| b1| b2| b3| 
    +-------+-----+-----+-----+ 
    |  1| null| null| null| 
    |  2| null| null| null| 
    |  3| null| null| null| 
    |  8| b1-8| b2-8|b3-15| 
    |  9| b1-9| b2-9|b3-17| 
    |  10|b1-10|b2-10|b3-19| 
    +-------+-----+-----+-----+ 

Ich möchte die Daten in einem Datenrahmen kombinieren. Ich schließe mich wie folgt verwenden:

val finalDF = colsToShiftRenamedDF.join(colsToKeepDF, Seq("$$RowId")) 

Das Ergebnis ist die folgende Datenrahmen

+-------+----+----+----+-----+-----+-----+ 
    |$$RowId| b1| b2| b3| b1| b2| b3| 
    +-------+----+----+----+-----+-----+-----+ 
    |  1|a1-1|a2-1|a3-1| null| null| null| 
    |  2|a1-2|a2-2|a3-2| null| null| null| 
    |  3|a1-3|a2-3|a3-3| null| null| null| 
    |  8|null|null|null| b1-8| b2-8|b3-15| 
    |  9|null|null|null| b1-9| b2-9|b3-17| 
    |  10|null|null|null|b1-10|b2-10|b3-19| 
    +-------+----+----+----+-----+-----+-----+ 

Jede Beratung schätzen

Antwort

1

Die Art und Weise Sie auf jeden Fall Sie beitreten columns jedes table geben würde, obwohl sie null. Sie sollten einige zusätzliche Schritte hinzufügen, wenn Sie die Duplikate nicht benötigen.

import org.apache.spark.sql.functions._ 
val finalDF = colsToShiftRenamedDF.as("t1").join(colsToKeepDF.as("t2"), Seq("$$RowId")) 
    .select(col("$$RowId"), 
    when(col("t1.b1").isNull || col("t1.b1") === "null", col("t2.b1")).otherwise(col("t1.b1")).as("b1"), 
    when(col("t1.b2").isNull || col("t1.b2") === "null", col("t2.b2")).otherwise(col("t1.b2")).as("b2"), 
    when(col("t1.b3").isNull || col("t1.b3") === "null", col("t2.b3")).otherwise(col("t1.b3")).as("b3")) 

die Sie Ausgabe dataframe als

+-------+-----+-----+-----+ 
|$$RowId|b1 |b2 |b3 | 
+-------+-----+-----+-----+ 
|1  |a1-1 |a2-1 |a3-1 | 
|2  |a1-2 |a2-2 |a3-2 | 
|3  |a1-3 |a2-3 |a3-3 | 
|8  |b1-8 |b2-8 |b3-15| 
|9  |b1-9 |b2-9 |b3-17| 
|10  |b1-10|b2-10|b3-19| 
+-------+-----+-----+-----+ 

Ich hoffe, geben die Antwort hilfreich

+0

ich mit etwas ähnliches am Ende kam, aber anstatt kommen, benutzte ich withColumn , was ich vermute, ist langsamer als der Prozess eine Spalte zu einer Zeit geht. Tausend Dank!! – Jake

+1

Mein Vergnügen @Jake, danke für die Annahme und Upvote. :) –

+0

Ramesh, nur wenn Sie die Zeit ersparen können, ist es möglich, den Code dynamisch abhängig von der Anzahl der Spalten zu verschieben, sagen b1-bn und a1-an (wo count bn == count an)? Wenn ja, vielleicht post als zusätzliche Antwort. Ich weiß, dass dies viel verlangt, also ignoriere es, wenn du beschäftigt bist. Ich bin schon dankbar für Ihre Hilfe – Jake

Verwandte Themen