使用含APPLY CHANGES INTO的流式表作为源的DLT无法增量加载问题
问题解答:基于APPLY CHANGES INTO流式表的DLT下游能否增量加载?
核心结论
以使用APPLY CHANGES INTO的流式表为源的DLT完全可以实现增量加载,APPLY CHANGES INTO本身不会破坏DLT的增量能力。你当前遇到的全量重算问题,是下游表的定义方式导致DLT无法自动识别增量变更路径。
问题原因分析
你的下游表bronze_table_clean是普通LIVE TABLE(本质为物化视图),直接查询源流式表bronze_table_stream时,DLT无法自动追踪SCD类型表的增量变更——因为SCD表的更新是基于主键的合并操作,而非单纯的追加写入,因此会触发全量重计算。
解决方案
要实现下游表的增量加载,需通过以下方式让DLT识别源表的增量变更:
方案1:将下游表改为流式表,用STREAM()读取源表增量
将下游表定义为STREAMING TABLE,并通过STREAM()函数包裹源SCD表,DLT会自动追踪源表的增量变更日志,实现增量计算:
CREATE OR REFRESH STREAMING TABLE bronze_table_clean ( CONSTRAINT valid_id EXPECT (`Id` IS NOT NULL AND TYPEOF(`Id`) = 'int') ON VIOLATION FAIL UPDATE ) AS SELECT `Id`, `OtherColumn1`, `OtherColumn2` FROM STREAM(live.bronze_table_stream)
方案2:开启源表的变更数据捕获(CDF),在下游表中消费增量
如果需要保留下游表为普通LIVE TABLE,可以先开启源流式表的CDF,再通过table_changes()函数获取增量:
- 修改源流式表定义,开启CDF:
CREATE OR REFRESH STREAMING TABLE bronze_table_stream TBLPROPERTIES (delta.enableChangeDataFeed = true); -- 新增CDF开启配置 APPLY CHANGES INTO live.bronze_table_stream FROM stream(bronze_catalog.bronze_schema.bronze_table) KEYS (`Id`) APPLY AS DELETE WHEN `__$operation` = 1 SEQUENCE BY `__$seqval` COLUMNS * EXCEPT (`__$start_lsn`, `__$operation`, `__$update_mask`, `__$seqval`) STORED AS SCD TYPE 1;
- 下游表通过
table_changes()消费增量:
CREATE OR REFRESH LIVE TABLE bronze_table_clean ( CONSTRAINT valid_id EXPECT (`Id` IS NOT NULL AND TYPEOF(`Id`) = 'int') ON VIOLATION FAIL UPDATE ) AS SELECT `Id`, `OtherColumn1`, `OtherColumn2` FROM table_changes('live.bronze_table_stream', LAST_COMMITTED_VERSION())
关键说明
APPLY CHANGES INTO创建的SCD表本身支持增量追踪,无论是通过STREAM()还是CDF,都能让下游获取增量变更。- 普通
LIVE TABLE默认会全量扫描源表,除非明确指定增量消费路径,否则DLT会默认规划为全量重算。
内容的提问来源于stack exchange,提问作者Tim Frazer
相关产品推荐
相关产品推荐

