2017-09-01 59 views
0

我有兩個scala數據框。儘管下面給出here的例子中,我仍然得到重複Scala:DataFrame.join仍在創建重複項

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

我希望將數據合併到一個數據幀。我用加入如下:

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

結果如下數據框

+-------+----+----+----+-----+-----+-----+ 
    |$$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| 
    +-------+----+----+----+-----+-----+-----+ 

任何意見讚賞

回答

1

你是加盟肯定會給你每tablecolumns,即使他們的方式null如果您不需要重複項,您應該添加一些附加步驟。

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

,這將給你輸出dataframe作爲

+-------+-----+-----+-----+ 
|$$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| 
+-------+-----+-----+-----+ 

我希望答案是有幫助的

+0

我想出了在年底類似的東西,而不是用加盟,我用withColumn ,因爲這個過程一次只有一列,所以我懷疑這個過程比較慢。太感謝了!! – Jake

+1

我的榮幸@Jake,感謝您的接受和讚揚。 :) –

+0

Ramesh,只有當你可以騰出時間,是否有可能使代碼動態依賴於要移動的列數,比如b1-bn和a1-an(其中count bn == count an)?如果是的話,也許作爲附加答案發布。我知道這是很重要的,所以如果你很忙,請忽略。我已經感謝您的幫助 – Jake