我有两个数据帧(Scala Spark)A和B.当A("id") == B("a_id")
我要将A("value")
更新为B("value")
时。由于必须重新创建DataFrame,我假设我必须进行一些连接和withColumn调用,但我不确定如何执行此操作。在SQL中,它将是一个关于自然连接的简单更新调用,但由于某些原因,这在Spark中似乎很难?
答案 0 :(得分: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,您可以使用(write / count / ...),但原始DataFrame保持不变。