2017-07-26 12 views
0

条件付きで1つの列をマージする必要がある2つのデータフレームがあります。 id列にヌル値がある場合は、そこから値を取得するために別のDFを参照する必要があります。私の最終的な所望の結果された状態でScalaで条件付きで2つのデータフレームをマージする

df1.show() 
+-----+---+----+-----+ 
|group|cat| id|value| 
+-----+---+----+-----+ 
| X| A| 1| 20.0| 
| X| A| 2| 20.0| 
| X| A|null| 55.0| 
| X| B| 1| 20.0| 
| X| B|null| 55.0| 
| Y| A| 3| 20.0| 
| Y| A| 4| 20.0| 
| Y| A|null| 55.0| 
| Y| B| 4| 20.0| 
| Y| B|null| 55.0| 
+-----+---+----+-----+ 
df2.show() 
+---+-------+ 
|cat|  id| 
+---+-------+ 
| A|1 2 3 4| 
| B| 1 4| 
+---+-------+ 

+-----+---+-------+-----+ 
|group|cat|  id|value| 
+-----+---+-------+-----+ 
| X| A|  1| 20.0| 
| X| A|  2| 20.0| 
| X| A|1 2 3 4| 55.0| 
| X| B|  1| 20.0| 
| X| B| 1 4| 55.0| 
| Y| A|  3| 20.0| 
| Y| A|  4| 20.0| 
| Y| A|1 2 3 4| 55.0| 
| Y| B|  4| 20.0| 
| Y| B| 1 4| 55.0| 
+-----+---+-------+-----+ 

私はここで別の答えのようなもの(Conditional Join in Spark DataFrame

val joinCondition = when($"a.id".isNull && $"a.cat" === "b.cat", $"a.id"===$"b.id") 
    .otherwise($"a.id") 

df1.as('a).join(df2.as('b), joinCondition).show 

を試みたが、常に空のデータフレームで終わるしました。

正しい結合条件について考えていますか?

答えて

0

あなたは、2つのデータフレームを結合して、​​3210機能を使用してdf2からididを更新することができます。

(df1.join(df2.withColumnRenamed("id", "id2"), Seq("cat"), "left") 
    .withColumn("id", coalesce($"id", $"id2")).drop("id2").show) 

+---+-----+-------+-----+ 
|cat|group|  id|value| 
+---+-----+-------+-----+ 
| A| X|  1| 20.0| 
| A| X|  2| 20.0| 
| A| X|1 2 3 4| 55.0| 
| B| X|  1| 20.0| 
| B| X| 1 4| 55.0| 
| A| Y|  3| 20.0| 
| A| Y|  4| 20.0| 
| A| Y|1 2 3 4| 55.0| 
| B| Y|  4| 20.0| 
| B| Y| 1 4| 55.0| 
+---+-----+-------+-----+ 
+1

はあなたに感謝!私はそれを思っていたことを知っていた、ちょうどそこに行くことができなかった! – ksdaly

関連する問題