首页 > 解决方案 > spark:合并两个数据帧,如果两个数据帧中的ID重复,则df1中的行覆盖df2中的行

问题描述

有两个数据框:df1 和 df2 具有相同的架构。ID 是主键。

我需要合并两个 df1 和 df2。这可以通过union除了一个特殊要求来完成:如果 df1 和 df2 中存在具有相同 ID 的重复行。我需要将其保留在 df1 中。

df1:

ID col1 col2
1  AA   2019
2  B    2018

df2:

ID col1 col2
1  A    2019
3  C    2017

我需要以下输出:

df1:

ID col1 col2
1  AA   2019
2  B    2018
3  C    2017

这个怎么做?谢谢。我认为可以注册两个 tmp 表,进行完全连接并使用coalesce. 但我不喜欢这种方式,因为实际上大约有 40 列,而不是上面示例中的 3 列。

标签: scaladataframeapache-sparkapache-spark-sql

解决方案


鉴于两个 DataFrame 具有相同的架构,您可以简单地df1与&的left_anti连接联合:df2df1

df1.union(df2.join(df1, Seq("ID"), "left_anti")).show
// +---+---+----+
// | ID|co1|col2|
// +---+---+----+
// |  1| AA|2019|
// |  2|  B|2018|
// |  3|  C|2017|
// +---+---+----+

推荐阅读