ODS 是什么
ODS(Operational Data Store)是数仓的贴源层,承接从业务库、日志、埋点同步过来的原始数据。第一条原则是保真:字段名、类型、取值尽量与源系统一一对应,只做抽取与装载,不在这里写业务口径。第二条原则是可追溯:每行数据都带装载时间、来源系统等审计字段,任何下游结论都能回到源值核对。ODS 通常按天分区保留快照或增量流水,具体取决于源系统的抽取方式。
基本信息
| 定位 | 贴源缓冲层,数仓的最上游 |
|---|---|
| 加工范围 | 只补审计字段,不改业务语义 |
| 历史保留 | 按天快照,或保留增量流水 |
| 产出特征 | 字段与源表一一对应 |
| 同步方式 | 全量覆盖、增量追加或 CDC 实时同步 |
典型使用场景
- 对接新数据源:先把原始数据落地到 ODS,再讨论怎么加工
- 数据对账:下游指标异常时用 ODS 与源系统逐行比对,判断是同步丢数还是加工出错
- 临时取数:源库不允许直连时,从 ODS 直接捞原始字段
- 源系统改字段:ODS 保留变更前后的原值,用于评估影响范围
- 历史回溯:源数据被覆盖更新后,仍可从 ODS 快照还原当时状态
贴源建表
贴源建表
CREATE TABLE ods_order (
order_id STRING COMMENT '订单ID原值',
user_id STRING COMMENT '用户ID原值',
pay_amt STRING COMMENT '支付金额原值',
order_status STRING COMMENT '状态原值',
etl_load_time STRING COMMENT '装载时间',
etl_source STRING COMMENT '来源系统'
) COMMENT '订单贴源表'
PARTITIONED BY (dt STRING COMMENT '数据日期');两种装载方式
两种装载方式
-- 全量覆盖:每天重抽一份快照,历史可回溯
INSERT OVERWRITE TABLE ods_order PARTITION (dt='2026-10-13')
SELECT *, current_timestamp() AS etl_load_time, 'order_db' AS etl_source
FROM src_order;
-- 增量追加:只捞当天变更,ODS 保留全量流水
INSERT INTO TABLE ods_order PARTITION (dt='2026-10-13')
SELECT *, current_timestamp(), 'order_db' FROM src_order WHERE updated_at >= '2026-10-13';审计字段约定
| 字段 | 含义 | 用途 |
|---|---|---|
| etl_load_time | 数据装载到数仓的时间 | 区分数据到达时间与业务发生时间 |
| etl_source | 来源系统或库表标识 | 多源汇聚时判断数据归属 |
| dt | 分区日期,通常取业务日期 | 分区裁剪与逐日回溯 |
| etl_batch_id | 装载批次号 | 同一批次整体回滚或重跑 |
ODS 里直接写业务口径(如剔除退款单)会让数仓的账与源系统对不上,事后追溯时无法判断差异是同步丢数还是加工过滤,成本很高。
贴源字段建议先按字符串落地,避免源系统改类型导致装载直接失败;类型转换统一放到 DWD 做,转换失败的行在 DWD 层可以单独统计并回看原值。