首页/数据/数据工程与 ETL 速查/CDC 进数仓的落地方式
CDC 与同步53 条

CDC 进数仓的落地方式

CDC 进数仓有两条常见路径:ODS 建 append-only 变更日志表(保留全部变更,可重放、可审计),或直接 upsert 成贴源镜像表;之后由 DWD 负责去重、清洗与维度关联。直投 DWD 省存储但丢失变更全历史,补数只能依赖源端重放,要按追溯需求权衡。

CDC 进数仓是什么

CDC 进数仓有两条常见路径:一是在 ODS 建 append-only 的变更日志表,保留全部变更(可重放、可审计),由 DWD 负责去重、清洗与维度关联;二是直接按主键 upsert 成贴源镜像表,查询即用。直投镜像表省存储、省加工,但丢失变更全历史,事后需要重放时只能回到源端——因此选择哪条路径,本质是在「追溯能力」与「存储与加工成本」之间做权衡。

基本信息

路径一ODS 变更日志表:追加写入,保留 op、位点、事件时间等列
路径二ODS 贴源镜像表:按主键 upsert,与源表结构接近
位点列建议保留源端文件名与偏移,或 GTID,便于对账与续传
去重位置日志表到 DWD 的加工环节按主键与位点去重
分区与生命周期日志表按天分区并设定保留期,否则存储增长不可控
下游加工DWD 负责清洗与维度退化,DWS 与 ADS 面向指标

典型使用场景

  • 审计与追溯要求高的场景:需要还原任意历史时点的数据状态
  • 口径变更需重算:有完整变更日志才能按新逻辑回刷历史
  • 实时看板支撑:镜像表可直接读,省去加工层延迟
  • 对账排障:日志表里的位点与操作类型可用于定位差异来源
  • 多下游复用:一份日志表同时支撑明细重算与实时镜像两条链路

分层落地示意

分层落地示意
# 变更流从源端一路向下
binlog -> CDC -> Kafka(变更流)
  -> ODS:变更日志表(追加 + 位点列)或贴源镜像表(upsert)
  -> DWD:去重 / 清洗 / 维度关联
  -> DWS / ADS:聚合与指标

日志表落库与去重加工

日志表落库与去重加工
-- ODS 变更日志表:只追加,保留位点与事件时间,不覆盖历史
INSERT INTO ods_trade_order_change_log
SELECT order_id, op, before_json, after_json,
       source_file, source_pos, ts_ms, etl_time
FROM cdc_stage WHERE dt = '2026-10-11';

-- DWD 加工:按主键与位点去重,剔除删除事件
INSERT OVERWRITE TABLE dwd_trade_order_di PARTITION (dt = '2026-10-11')
SELECT order_id, user_id, pay_amount, status
FROM (
  SELECT after_json.order_id AS order_id, after_json.user_id AS user_id,
         after_json.pay_amount AS pay_amount, after_json.status AS status,
         ROW_NUMBER() OVER (PARTITION BY order_id, source_file, source_pos ORDER BY ts_ms DESC) AS rn
  FROM ods_trade_order_change_log
  WHERE dt = '2026-10-11' AND op <> 'd'
) t WHERE t.rn = 1;

两条路径对照

对比项变更日志表贴源镜像表
内容全部变更,含删除仅最新状态
可重放可以,任意区间重算不可以,需回源端
存储成本高,随变更量增长低,约等于源表规模
查询便利需加工才能用可直接查询
适用判断追溯与重算需求强只关心当前状态
只落镜像表不落日志表,事后需要重放变更时没有原始素材,只能回到源端重新抽取,窗口与风险都大得多。
变更日志表必须配分区与生命周期策略:不做归档与清理,存储成本会随业务量持续上升,最终挤压其他表的预算。

易错点

  • 只落镜像表不落日志表,需要重放时没有原始素材,只能回源端重抽
  • 日志表不做分区与归档,存储成本持续上升且查询越来越慢
  • 位点列不保留,出问题时无法判断缺的是哪一段变更,也无法与源端对齐
  • 删除事件被丢弃,目标端数据删除状态与源端长期不一致
  • 日志表直接当明细表给下游用,去重与清洗逻辑缺失,重复行流向指标

数据来源与参考

  • Kimball《The Data Warehouse Toolkit》(分层与 ETL 思想)
  • Debezium 官方文档(事件中的位点元数据)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌