2017-03-17 274 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

相關問題