spark:合并两个数据帧,如果两个数据帧中的ID重复,df1中的行覆盖df2中的行

BAE*_*BAE 2 scala dataframe apache-spark apache-spark-sql

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

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

df1:

ID col1 col2
1  AA   2019
2  B    2018
Run Code Online (Sandbox Code Playgroud)

df2:

ID col1 col2
1  A    2019
3  C    2017
Run Code Online (Sandbox Code Playgroud)

我需要以下输出:

df1:

ID col1 col2
1  AA   2019
2  B    2018
3  C    2017
Run Code Online (Sandbox Code Playgroud)

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

Leo*_*o C 6

鉴于两个 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|
// +---+---+----+
Run Code Online (Sandbox Code Playgroud)