ODS 贴源层设计

ODS 与源系统保持同构:字段名、类型尽量不动,只做落地与分区管理,保留原始信息便于对账与回溯;常见做法是增量抽取与周期全量快照两条链路并存。

ODS 的设计原则

ODS(贴源层)与源系统保持同构:字段名、类型尽量不动,只做落地与分区管理,保留原始信息以便对账与回溯。核心原则是「不加工、可追溯」——任何业务规则的清洗都放到 DWD,这样数据对不上时还能回到最原始的记录去核对。

增量与快照两条链路

常见做法是两条链路并存:定时增量抽取覆盖当天的变化数据,周期性全量快照保留某个时刻的完整状态。增量保证时效与成本,全量快照用来兜住物理删除与历史修正——只保留增量的话,源端删除的记录在贴源层永远看不出来。

基本信息

原则同构落地、不加工、可追溯
分区按抽取日期 dt 分区,写入时按分区覆盖
写入方式增量场景按当日分区覆盖,避免重复追加
保留策略按合规要求确定原始数据保留期限
常见链路增量抽取加周期全量快照两条链路并存

ODS 常见做法

做法目的注意
字段与源库对齐保留原始语义,便于对账源库改字段时需要同步演进
按抽取日期分区重跑时按分区覆盖,天然幂等分区列命名统一,避免混乱
保留原始字符串不做类型转换,避免精度与格式丢失下游转换时统一规则
同时保留全量快照捕获删除与历史修正存储成本上升,需权衡保留周期

典型使用场景

  • 新数据源接入:先把原始表落地,再逐层加工
  • 对账与追溯:下游数字异常时回查最原始记录
  • 数据修复:源端历史数据被修正后,重刷对应分区
  • 合规审计:保留原始数据以满足留痕要求
  • 全量开荒:用批量工具或 CDC 快照导入存量数据

ODS 建表

ODS 建表
CREATE TABLE IF NOT EXISTS ods_order_mysql (
  id           BIGINT COMMENT '订单id',
  user_id      BIGINT,
  total_amount DECIMAL(18,2),
  status       INT,
  create_time  STRING,          -- 保留源库原始格式,不在这一层做类型转换
  update_time  STRING
) COMMENT '订单表贴源'
PARTITIONED BY (dt STRING COMMENT '抽取日期')
STORED AS ORC;

当日分区覆盖写入

当日分区覆盖写入
-- 只覆盖当天分区:重跑多少次结果都一致
INSERT OVERWRITE TABLE ods_order_mysql PARTITION (dt = '2026-10-11')
SELECT id, user_id, total_amount, status, create_time, update_time
FROM src_order
WHERE update_time >= '2026-10-11 00:00:00'
  AND update_time <  '2026-10-12 00:00:00';   -- 左闭右开,边界不重不漏
ODS 不做业务规则清洗能省掉大量「数据对不上却无法回源」的争论:原始值一旦被转换或脱敏覆盖,就没法和源库逐字段核对了。
只保留增量、不保留任何全量快照,源端物理删除的记录在贴源层无从发现:目标端的已删除数据会永久残留,对账时只能靠人回忆业务流程。

易错点

  • 在 ODS 做类型转换与脱敏,原始值丢失后无法与源库逐字段对账
  • 只保留增量不保留全量快照,源端物理删除的记录无从发现,目标端长期残留脏数据
  • 写入时用追加而不是分区覆盖,重跑任务产生成倍重复数据
  • 分区区间写成闭区间(两端都取到),边界时刻的记录被重复写入相邻两天

数据来源与参考

  • 阿里《大数据之路:阿里巴巴大数据实践》数据引入层(ODS)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌