0
我有兩個數據幀(Scala Spark)A和B.當我想更新至B("value")
時A("id") == B("a_id")
。由於DataFrames必須重新創建我假設我必須做一些連接和ColumnCall調用,但我不知道如何做到這一點。在SQL中,它將是一個自然連接的簡單更新調用,但由於某種原因,這在Spark中似乎很難?將一個數據幀列值替換爲另一個值
我有兩個數據幀(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