将一个数据帧列值替换为另一个值

时间:2017-03-17 01:20:24

标签: scala apache-spark dataframe

我有两个数据帧(Scala Spark)A和B.当A("id") == B("a_id")我要将A("value")更新为B("value")时。由于必须重新创建DataFrame,我假设我必须进行一些连接和withColumn调用,但我不确定如何执行此操作。在SQL中,它将是一个关于自然连接的简单更新调用,但由于某些原因,这在Spark中似乎很难?

1 个答案:

答案 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保持不变。