ID为object类型的DataFrame如何获取最后一条ID实现BigQuery增量写入
关于liveAt作为增量判断依据的问题
如果存在两条liveAt完全相同的记录,会出现两类问题:
- 若你设置拉取条件为
liveAt > 上次同步最大liveAt,会漏掉所有和上次最大liveAt时间相同的未同步记录,导致数据丢失 - 若你设置拉取条件为
liveAt >= 上次同步最大liveAt,会重复拉取已经写入过的同时间记录,后续写入会产生重复数据
另外从你给出的示例数据可以看到,原id列存在重复值,本身就不具备唯一标识能力,不能直接作为增量游标使用。你之前本地生成自增New_ID的方式之所以无法关联新数据,是因为这个自增ID是你本地数据集的局部序号,和API返回的源数据没有固定关联规则,不同批次拉取的数据生成的ID会重复,完全不具备跨批次的标识能力。
解决方案
可以按照以下两步处理:
1. 先确定全局唯一标识
用多字段组合生成唯一键,从你给出的字段来看,id + sentAt + liveAt的组合可以实现全局唯一,即使原id重复,搭配两个时间字段也能区分所有记录。
2. 选择适配的增量同步逻辑
方案A:时间游标 + 边界去重(适合数据量较大的场景)
- 每次同步前,先从BigQuery表中查询当前最大的
sentAt值作为增量游标 - 调用CM Commerce API时,传入参数拉取
sentAt >= 该游标值的所有数据 - 对拉取到的新数据,先过滤掉和BigQuery中
sentAt = 游标值的记录重复的数据(用前面定义的组合唯一键匹配判断) - 把剩下的未存在的新数据以
write_append模式写入BigQuery即可,不会出现漏数或者重复
方案B:BigQuery MERGE语句合并(适合数据量较小的场景)
- 每次拉取API的全量数据(或者指定时间范围的近期数据),临时写入BigQuery的一张临时表
- 执行BigQuery的MERGE语句,以组合唯一键为匹配条件,匹配到的记录按需更新,未匹配到的新记录直接插入主表,完全不需要手动维护游标逻辑
补充:自动生成自增整数ID
如果你需要一列整数类型的唯一自增ID,不需要在本地代码中生成,直接在BigQuery建表时添加自增列即可:
ALTER TABLE your_table_name ADD COLUMN New_ID INT64 GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1)
后续新写入的记录BigQuery会自动分配唯一的自增ID,完全不需要你手动维护关联逻辑。
内容的提问来源于stack exchange,提问作者Bushmaster
相关产品推荐
相关产品推荐

