将一个数据帧列值替换为另一个值
问题描述:
我有两个数据帧(Scala Spark)A和B.当我想更新至B("value")
时A("id") == B("a_id")
。由于DataFrames必须重新创建我假设我必须做一些连接和ColumnCall调用,但我不知道如何做到这一点。在SQL中,它将是一个自然连接的简单更新调用,但由于某种原因,这在Spark中似乎很难?将一个数据帧列值替换为另一个值
答
事实上,左联接和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保持不变。
首先,你可以用'col'函数代替它们,例如, 'col(“A.id”)'如果他们给你带来麻烦;其次 - 您需要在每个要使用'$'的范围内输入spark.implicits._'。 –
好吧,这似乎使双倍我的数据帧大小? – noname
像左连接由于某种原因而变得像完全外连接 – noname