如何拉取Snowflake stream创建前已加载到源表的历史数据
存量历史记录同步解决方案
当前你创建的Stream仅能捕获创建完成后产生的增量数据,无法直接追溯创建前已写入的存量记录,可通过以下两种方案完成存量同步,同时不影响后续增量同步链路的正常运行:
方案1:一次性手动批量插入存量数据(通用方案,适配所有支持Stream机制的数仓)
- 操作前提:确认Table-A的存量记录未发生变更、且Stream同步任务暂未启动(或可暂时暂停同步任务避免数据冲突)
- 操作步骤:
- 直接查询Table-A中需要同步的存量记录,过滤条件为
EMPID < 103,写入目标表Table-B即可,SQL示例:
INSERT INTO Table-B (EMPID, ENAME, SAL, REC_CREATED) SELECT EMPID, ENAME, SAL, REC_CREATED FROM Table-A WHERE EMPID IN (101,102); -- 若存在更多低于103的存量记录,可将过滤条件改为 EMPID < 103 批量拉取- 插入完成后校验Table-B的存量数据与Table-A完全一致,再启动Stream的增量同步任务即可,后续103及之后的新增数据会自动通过Stream同步,不会出现重复或者遗漏问题。
- 直接查询Table-A中需要同步的存量记录,过滤条件为
方案2:回溯表历史版本调整Stream捕获范围(仅适用Snowflake等支持时间旅行、Stream偏移量调整的数仓)
如果你使用的数仓支持表时间旅行功能,可以将Stream的捕获起始点调整到存量记录写入之前的时间点,一次性拉取全量数据后再启动同步:
- 操作步骤:
- 先确认Table-A存量记录的最后写入时间,你给出的两条存量记录最后写入时间为
21-11-2021 10:35,调整Stream的起始偏移量到该时间点之前即可,Snowflake环境SQL示例:
ALTER STREAM 你的Stream名称 SET AT => '2021-11-20 00:00:00';- 消费一次Stream中的数据,即可同时获取101、102的存量记录以及103以后的增量记录,写入Table-B即可。
- 先确认Table-A存量记录的最后写入时间,你给出的两条存量记录最后写入时间为
注意:如果你的同步链路已经启动、并且已经同步过103之后的部分数据,建议优先选择方案1,避免方案2调整偏移量后出现重复同步的问题。
内容的提问来源于stack exchange,提问作者NazirAhammad Syed
相关产品推荐
相关产品推荐

