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

使用含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()函数获取增量:

  1. 修改源流式表定义,开启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;
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:55:19