0

我有兩個表,其中一個具有值,另一個具有查找值。我想用表2中的值替換表1,但沒有找到一個這樣做的優雅方式。從查找表中替換列

Table 1 (main) 

name  age  country  last_visited 
x1  a1   UK   2016 
x2  a3   US   2017 
x3  a1   China   2015 

Table 2 (lookup) 
code  value date_updated 
x1  Dom  2017 
a1  25  2017 
x2  Peter  2017 
x3  Alice  2017 
a3  26  2017 

Final Table (What i want) 

name  age  country  last_visited 
Dom  25   UK   2016 
Peter  26   US   2017 
Alice  25   China   2015 

我試過將表1連接到表2,但後來這涉及到我後來更換/刪除列,我必須爲每個列單獨執行此操作。我只給了一小部分的列,我有上面的查找值,但實際上我有大約8列包含在同一個表中的查找值。我如何做到這一點。

val unsanitised_data = table1.join(table2, table1.col("name") === table2.col("code"), "left").drop("last_visited", "name", "code") 

現在我需要重命名「值」來命名,並再次爲年齡和其他列做同樣的事情。這是做這件事的最好方法嗎?

+0

替換的邏輯是什麼? – eliasah

+0

名稱的邏輯是table1.col(「name」)=== table2.col(「code」),對於age1.table(「age」)=== table2.col(「code」) – CodeGeek123

回答

3

簡單joinselect功能應該可以解決您的問題

df1.join(df2, df1("name")=== df2("code"), "left").select($"value".as("name"), $"age", $"country", $"last_visited") 
    .join(df2,df1("age")=== df2("code"), "left").select($"name", $"value".as("age"), $"country", $"last_visited") 
    .show(false) 

編輯

如果你有太多的columns,並不需要第二個表列,那麼你可以做

df1.join(df2, df1("name")=== df2("code"), "left").withColumn("name", col("value")).drop(df2.columns: _*) 
    .join(df2,df1("age")=== df2("code"), "left").withColumn("age", col("value")).drop(df2.columns: _*) 
    .show(false) 
+0

這裏的問題我的桌子上有150列嗎?因此,在select語句中單獨選擇每一個可能不是最實用的;( – CodeGeek123