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。