如何在Dataform中执行存储过程实现当日表更新防重复?
在Dataform里用存储过程控制每日表更新的方案
核心逻辑
因为基于日期的记录历史太复杂,没法用Dataform原生的增量更新,那咱们就靠存储过程检查表的最后更新时间——如果表今天已经更新过,就跳过更新脚本;没更新过就执行。
具体实现步骤
1. 写个存储过程判断是否需要更新
先搞个存储过程,用来查目标表的最后更新时间(可以从数据源的系统表拿,比如BigQuery的INFORMATION_SCHEMA.TABLES,或者你自己维护的更新日志表,看你用啥数据源),返回是否需要更新的布尔值。
拿BigQuery举例子:
CREATE OR REPLACE PROCEDURE `your-project.your-dataset.check_table_needs_update`( IN table_name STRING, OUT needs_update BOOLEAN ) BEGIN DECLARE last_update_date DATE; -- 从系统表取最后修改日期 SELECT DATE(UPDATE_TIME) INTO last_update_date FROM `your-project.your-dataset.INFORMATION_SCHEMA.TABLES` WHERE TABLE_NAME = table_name; -- 对比当前日期,判断要不要更新 SET needs_update = (last_update_date != CURRENT_DATE()); END;
2. 在Dataform脚本里调用存储过程控制执行
在Dataform的SQLX文件里,先调用存储过程拿到判断结果,再根据结果决定跑不跑更新逻辑。
示例代码:
config { type: "table", tags: ["daily_update"] } DECLARE needs_update BOOLEAN; -- 调用存储过程判断是否需要更新 CALL `your-project.your-dataset.check_table_needs_update`("your_target_table", needs_update); -- 只有需要更新的时候才执行更新脚本 IF needs_update THEN -- 这里写你的表更新逻辑,比如全量同步源表数据 SELECT * FROM `your-project.your-dataset.source_table`; END IF;
3. 踩坑提醒
- 不同数据源的存储过程语法、系统表结构不一样,比如Snowflake、PostgreSQL的写法和BigQuery有区别,得根据你用的数据库调整。
- 如果你的表更新时间不是存在系统表,而是自己建的更新日志表,那存储过程里查时间的逻辑就得改成从日志表里取最新记录的日期。
- Dataform里用条件语句的时候,得保证语法符合你的数据源要求,别写错了导致跑失败。
内容的提问来源于stack exchange,提问作者RaptorX
相关产品推荐
相关产品推荐

