2017-03-17 280 views
0

我有两个数据帧(Scala Spark)A和B.当我想更新至B("value")A("id") == B("a_id")。由于DataFrames必须重新创建我假设我必须做一些连接和ColumnCall调用,但我不知道如何做到这一点。在SQL中,它将是一个自然连接的简单更新调用,但由于某种原因,这在Spark中似乎很难?将一个数据帧列值替换为另一个值

回答

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是一个新的数据框,您可以使用(写入/计数/。 ..)但原始的DataFrame保持不变。

+1

首先,你可以用'col'函数代替它们,例如, 'col(“A.id”)'如果他们给你带来麻烦;其次 - 您需要在每个要使用'$'的范围内输入spark.implicits._'。 –

+0

好吧,这似乎使双倍我的数据帧大小? – noname

+0

像左连接由于某种原因而变得像完全外连接 – noname

相关问题