我有两个数据帧DF1和DF2, id 作为唯一列, DF2可能包含DF1的现有记录的新记录和更新值,当我们合并两个数据帧时,结果应包括新记录,并且保留更新值的旧记录应保持原样。
输入示例:
id name
10 abc
20 tuv
30 xyz
和
id name
10 abc
20 pqr
40 lmn
当我合并这两个数据帧时,我希望结果为:
id name
10 abc
20 pqr
30 xyz
40 lmn
答案 0 :(得分:1)
使用外部join
后跟coalesce
。在斯卡拉:
val df1 = Seq((10, "abc"), (20, "tuv"), (30, "xyz")).toDF("id", "name")
val df2 = Seq((10, "abc"), (20, "pqr"), (40, "lmn")).toDF("id", "name")
df1.select($"id", $"name".as("old_name"))
.join(df2, Seq("id"), "outer")
.withColumn("name", coalesce($"name", $"old_name"))
.drop("old_name")
coalesce
将给出第一个非null值的值,在这种情况下返回:
+---+----+
| id|name|
+---+----+
| 20| pqr|
| 40| lmn|
| 10| abc|
| 30| xyz|
+---+----+
答案 1 :(得分:0)
df1.join(df2, Seq("id"), "leftanti").union(df2).show
| id|name|
+---+----+
| 30| xyz|
| 10| abc|
| 20| pqr|
| 40| lmn|
+---+----+