首页/数据/数仓建模速查/ODS 保真:不改值、不丢字段
分层与规范64 条

ODS 保真:不改值、不丢字段

贴源表字段与源系统一一对应,不做类型转换与值清洗;必要的技术字段(装载时间/来源/批次)只追加,保证任何加工结果都能回到源值。

数仓建模速查数据更新于 2026-10-13

ODS 的保真要求

贴源层的核心要求是保真:字段与源系统一一对应,不做类型转换、不做值清洗、不去重,源里是什么就存什么。技术上必要的字段(装载时间、来源系统、批次号)只在表尾追加。只有保真,下游任何加工结果都能回到源值复算,补数和故障取证才有依据。

基本信息

字段与源一一对应,不增不减
取值原样保留,含空串与脏数据
类型以 STRING 兜底承接
追加字段etl_load_time、etl_source、etl_batch
禁止入仓去重、强转类型、补默认值

典型使用场景

  • 源系统为全量接口:按日快照落分区,每天一份原样保存
  • 源系统为增量接口:按增量追加,用批次号标识每次装载
  • 排查源端问题:ODS 是唯一能证明源当时给了什么的层
  • 补数重算:用同一批次数据重跑下游,保证结果可复现
  • 上游类型频繁变动:ODS 统一字符串接收,类型转换一律放到 DWD

贴源 DDL 片段

贴源 DDL 片段
-- 源值里的脏数据(多余空格、斜杠日期、空串)原样入仓
CREATE TABLE ods_customer (
  cust_id       STRING COMMENT '客户ID(源值)',
  cust_name     STRING COMMENT '客户名(源值,可能为空串)',
  birth_dt      STRING COMMENT '出生日期(源值,未标准化)',
  etl_load_time STRING COMMENT '装载时间',
  etl_source    STRING COMMENT '来源系统',
  etl_batch     STRING COMMENT '批次号'
) PARTITIONED BY (dt STRING);

ODS 该做与不该做

动作是否允许原因
以 STRING 接收允许类型兼容,避免截断
追加 etl 技术字段允许可追溯批次与来源
入仓强转类型禁止脏值被写 NULL 或截断且无人知晓
按主键去重禁止源端补数后无法还原
覆盖或删改历史分区禁止审计断档,无法复算
ODS 强转数值类型时,像带单位的金额、空串这类值会被写成 NULL 或被截断,且丢了多少行不会报错,问题只能等下游客诉才暴露。
保真不等于不设规范:分区、命名、字段顺序仍要按标准执行,只是不改值;规范化与清洗全部留给 DWD。

易错点

  • ODS 层做去重:源端后续补数或修正时历史已不可还原,明细无法复算
  • 入仓时强转类型或补默认值:脏数据被静默吞掉,问题追到 ODS 就断了
  • 直接 UPDATE 或 DELETE 已有分区:审计断档,事后无法定位当时的源值
  • ODS 表字段与源不一致(少字段或多一层加工):源端加字段时下游全线返工

数据来源与参考

  • 阿里《大数据之路:阿里巴巴大数据实践》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌