You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spark Java/Scala中基于列合并两个DataFrame并实现更新覆盖

合并两个含唯一标识的DataFrame,保留更新与新增记录

需求说明

你有两个DataFrame(DF1和DF2),其中id是唯一标识列:

  • DF2里可能包含DF1现有记录的更新值,也可能有新的记录
  • 合并后需要保留三类数据:DF2的新记录、DF1中未被更新的原有记录、DF2更新后的记录

输入示例

DF1的数据:

id name
10 abc
20 tuv
30 xyz

DF2的数据:

id name
10 abc
20 pqr
40 lmn

期望合并结果

id name
10 abc
20 pqr
30 xyz
40 lmn

解决方法(基于Pandas)

方法1:使用combine_first(推荐,直观高效)

这个方法的核心逻辑是优先保留DF2的数据,DF2里没有的记录则从DF1中补充,完美匹配你的需求:

import pandas as pd

# 构造示例DataFrame
df1 = pd.DataFrame({'id': [10, 20, 30], 'name': ['abc', 'tuv', 'xyz']})
df2 = pd.DataFrame({'id': [10, 20, 40], 'name': ['abc', 'pqr', 'lmn']})

# 将id设为索引,方便按唯一标识对齐
df1_indexed = df1.set_index('id')
df2_indexed = df2.set_index('id')

# 执行合并:优先用df2的数据,缺失的从df1补全
result = df2_indexed.combine_first(df1_indexed).reset_index()

print(result)

运行后就能得到你想要的结果,而且自动处理了索引对齐,非常省心。

方法2:使用concat + drop_duplicates(灵活可控)

如果需要更自定义的合并逻辑,比如后续要加更多DF,这种方法更灵活:

import pandas as pd

df1 = pd.DataFrame({'id': [10, 20, 30], 'name': ['abc', 'tuv', 'xyz']})
df2 = pd.DataFrame({'id': [10, 20, 40], 'name': ['abc', 'pqr', 'lmn']})

# 先把DF2放在前面,再拼接DF1
combined = pd.concat([df2, df1])
# 按id去重,保留第一个出现的记录(也就是DF2的内容),然后排序
result = combined.drop_duplicates(subset='id', keep='first').sort_values('id').reset_index(drop=True)

print(result)

这个思路是让DF2的记录先出现,去重时优先保留它,再把DF1里独有的记录加进来,最后排序让结果更规整。

内容的提问来源于stack exchange,提问作者Venkat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:34:12