2016-12-04 59 views
1

有兩個數據幀。爲簡單起見,我把它們如下:如何連接兩個DataFrame並在火花中有條件替換一列

DataFrame1

id | name 
----------- 
0 | Mike 
1 | James 

DataFrame2

id | name | salary 
------------------- 
0 | M | 10 
1 | J | 20 
2 | K | 30 

我想加入上id兩個數據幀,並只保留列nameDataFrame1,同時保持如果沒有相應的id,則原始的一個在DataFrame2

它應該是:

id | name | salary 
-------------------- 
0 | Mike | 10 
1 | James | 20 
2 | K  | 30 

到目前爲止,我只知道如何通過連接兩個dataframes:

df1.join(df2, df1("id")===df2("id"), "left").select(df2("id"), df1("name"), df2("salary")) 

但它會使用空忽略名稱值 「K」。

謝謝!

回答

4

您可以使用​​3210,它返回給定列中不是null的第一列。 Plus - 使用left加入您應該加入df1df2而不是反過來:

import org.apache.spark.sql.functions._ 

df2.join(df1, df1("id")===df2("id"), "left") 
    .select(df2("id"), coalesce(df1("name"), df2("name")), df2("salary")) 
2

代替你可以使用DataFrameNaFunctions像下面空值...

df1.join(df2, df1("id")===df2("id"), "left_outer") 
.select(df2("id"), df1("name"), df2("salary")) 
.na.fill(ImmutableMap.of("name", "unknown")).show() 

其中「未知」是樣本值。你可以用你想要的值替換...

,如果你不想與空值的列

val joined = df1.join(df2, df1("id")===df2("id"), "left_outer") 
    .select(df2("id"), df1("name"), df2("salary")) 

val final = joined.where(joined.col("name").isNotNull) 
final.show() 

還行注意,在@Tzach提到瑣回答 def coalesce(e: Column*)功能

返回非空的第一列;如果所有輸入均爲空,則返回空值 。

如果您正在尋找那種......那麼您可以繼續。

相關問題