模型演进是什么
模型演进指已上线的事实表、维度表在业务变化后做结构或语义调整的受控过程:加字段、修口径、改粒度、换分区策略都算。它遵循兼容优先的次序——新增字段先行、新旧并行、灰度切换、确认对账一致后再下线旧路径,而不是直接修改线上表定义。对下游而言模型就是一份接口契约:字段名、粒度、单位一旦发布,任何改动都会传导到所有引用方,所以每次变更都要有迁移窗口和回滚方案。
基本信息
| 常见变更类型 | 加列 / 改语义 / 改粒度 / 改分区 |
|---|---|
| 风险排序 | 加列最低,改语义与改粒度最高 |
| 实施方式 | 新旧并行双跑 + 对账 |
| 必备产出 | 迁移说明、对账报告、回滚脚本 |
典型使用场景
- 业务新增属性:源系统加了字段,先在事实表末尾加可空列,老查询不受影响
- 口径修正:GMV 从「含运费」改成「不含运费」,必须新增列而不是原地改语义
- 粒度升级:订单粒度不够用,需要下钻到订单行,只能新建事实表
- 分区治理:由按到达时间分区改为按业务时间分区,需要重刷历史并切换调度
- 引擎迁移:Hive 表迁到 Doris 或湖表,物理实现变但逻辑模型与字段语义保持不变
- 模型合并:两张同粒度事实表合并为一张带来源维度的表,需要安排下游切换引用
演进四步加列示例
演进四步加列示例
-- 第 1 步:在表末尾加可空列,保证老查询不受影响
ALTER TABLE fact_order ADD COLUMNS (coupon_amt decimal(18,2) COMMENT '优惠金额(元)');
-- 第 2 步:新旧两条链路并行跑批,逐日做差异对账
SELECT dt, abs(old_amt - new_amt) AS diff FROM recon_order_day WHERE diff > 0.01;
-- 第 3 步:连续双跑差异为零后,通知下游把引用改指新表
-- 第 4 步:旧路径转只读,保留观察期后归档下线并登记台账变更类型与策略
| 变更 | 风险表现 | 推荐策略 |
|---|---|---|
| 新增可空列 | 下游 select * 会多列 | 低风险,直接加并写列注释 |
| 修改列语义 | 下游静默错数 | 新增列 + 双跑 + 切换,禁止原地改义 |
| 修改粒度 | 统计口径整体变化 | 建新表,旧表转只读保留 |
| 更换分区键 | 历史数据需重刷 | 重刷历史 + 调度切换 + 回滚预案 |
把切换前置条件提前写死:差异条数为零、金额差异在阈值内、下游任务全部改指新表、回滚脚本演练通过,四项齐了才允许切换,否则继续并行。
给已上线的列改语义是最隐蔽的事故源:SQL 不报错,报表数字整体偏移,往往到月结对账才被发现,此时历史数据已被污染。