加载模式是什么
加载模式决定目标表里最终留下什么,常见四类:全量覆盖(每次重写整表或整分区,适合小表与每日快照)、增量追加(只插入新事件,适合日志类数据)、拉链(用生效时间与失效时间两列保留维度历史版本)、upsert(按主键更新为最新状态)。选择依据是源端能力与下游对历史的需求:要查历史某个时点的状态就上拉链,只需要最新值就用 upsert。
基本信息
| 全量覆盖 | 适合小表与每日快照 |
|---|---|
| 增量追加 | 适合事件与日志,依赖去重字段 |
| 拉链 | 保留历史版本,记录生效与失效时间 |
| upsert | 按主键更新为最新状态 |
| 选择依据 | 源端能力 + 下游是否需要历史 |
加载模式对照
| 模式 | 适用 | 实现要点 |
|---|---|---|
| 全量覆盖 | 小表、每日快照 | 按分区 overwrite,其他历史分区不动 |
| 增量追加 | 事件与日志 | 靠批次号或事件 ID 去重 |
| 拉链 | 需要历史版本的维度 | 开链与闭链两段写入 |
| upsert | 只要主键最新态 | 用 merge 或主键模型实现 |
两种典型写法
两种典型写法
-- 增量追加:只插入当天新增,重跑前需先清空该分区
INSERT INTO TABLE dwd_user_login_di PARTITION (dt='2026-10-13')
SELECT user_id, login_time, '2026-10-13' AS dt
FROM stg_login
WHERE dt='2026-10-13';
-- 拉链:旧版本闭链填失效时间,再插入新版本开链
UPDATE dim_user SET end_date='2026-10-13'
WHERE user_id='U1' AND end_date='9999-12-31';追加模式必须有去重字段兜底(批次号、事件 ID,或业务主键加时间),否则任务失败后重跑会把同一批数据写第二遍,指标翻倍而且不易察觉。
全量覆盖与增量追加混用在同一张表上很危险:若某个分区被覆盖、其他分区靠追加,表里同一时间段的语义就不一致,后续按分区重算时结果无法预期。
加载模式应当写进表注释,让下游知道这张表是快照、流水还是最新态:同样是订单表,快照表可以直接按主键取数,流水表则必须先按主键去重再取,差别不写清楚就只能靠猜。