2017-03-17 15 views
0

私は2つのデータフレーム(Scala Spark)AとBを持っています。A("id") == B("a_id")A("value")B("value")に更新したいとします。 DataFramesを再作成する必要があるので、私はいくつかの結合とwithColumn呼び出しを行う必要があると仮定していますが、これを行う方法がわかりません。 SQLでは、自然な結合の簡単な更新呼び出しですが、何らかの理由でこれがSparkで難しいようですか?実際1つのデータフレーム列の値を別の値に置き換えます。

答えて

1

、左が参加し、selectコールは、トリックを行うだろう。本当の「更新」はここにありませんことを

// assuming "spark" is an active SparkSession: 
import org.apache.spark.sql.functions._ 
import spark.implicits._ 

// some sample data; Notice it's convenient to NAME the dataframes using .as(...) 
val A = Seq((1, "a1"), (2, "a2"), (3, "a3")).toDF("id", "value").as("A") 
val B = Seq((1, "b1"), (2, "b2")).toDF("a_id", "value").as("B") 

// left join + coalesce to "choose" the original value if no match found: 
val result = A.join(B, $"A.id" === $"B.a_id", "left") 
    .select($"id", coalesce($"B.value", $"A.value") as "value") 

// result: 
// +---+-----+ 
// | id|value| 
// +---+-----+ 
// | 1| b1| 
// | 2| b2| 
// | 3| a3| 
// +---+-----+ 

お知らせ - resultあなたは(/回数/書き込みを使用することができ、新たなデータフレームです。 ..)でも元のDataFramesは変更されません。

+1

まず、これらを 'col'関数で置き換えることができます。 'col(" A.id ")'彼らがあなたに問題を起こすならば。第二に、 '$ spark.implicits._'を' $ 'を使用するすべてのスコープで必要とします。 –

+0

これは私のデータフレームサイズを2倍にすると思われますか? – noname

+0

のように左の結合が何らかの理由で完全な外部結合のようになってしまう – noname

関連する問題