首页/数据/数仓建模速查/ODS 写入策略:只追加与每日快照
分层与规范64 条

ODS 写入策略:只追加与每日快照

贴源表通常只追加:源为全量接口时按日快照落分区,源为增量接口时按增量追加并带批次号;避免在 ODS 直接 UPDATE 已有分区。

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

ODS 写入策略:只追加

贴源层通常只追加:源端是全量接口时按日快照落分区,源端是增量接口时按增量追加并带批次号,CDC 源则按变更日志顺序入仓。明确禁止在 ODS 原地 UPDATE 已有分区——一旦原地改历史,审计链条断裂,复算能力也随之失去。

基本信息

全量源每日快照落分区
增量源按增量追加,带批次号
CDC 源变更日志顺序入仓
禁止动作原地 UPDATE 已有分区
快照保留近期全量加月末长期快照

典型使用场景

  • 全量接口(如维表全量拉取):每天落一份分区,保留按日快照
  • 增量接口:按增量追加,批次号作为重跑与回溯的锚点
  • CDC 变更日志:保留操作类型与时间戳,由下游拼装当前态
  • 补数:按批次重放,不修改已有批次内的数据
  • 存储控制:全量快照保留近 90 天,另外每月末保留一份长期快照

每日快照落分区

每日快照落分区
-- 全量源的每日快照:只写当天分区,历史分区不动
INSERT OVERWRITE TABLE ods_user_snapshot PARTITION (dt = '2026-10-12')
SELECT user_id, user_name, user_level, etl_load_time, etl_batch
FROM stg_user_daily;

-- 增量源:按批次分区追加,重跑时覆盖同一批次分区而不是再追加一份
-- INSERT OVERWRITE TABLE ods_user_inc
--   PARTITION (dt = '2026-10-12', batch = 'B2026101201')
-- SELECT user_id, user_name, etl_load_time FROM stg_user_inc;

写入策略对照

源类型写入方式分区设计
全量接口每日快照覆盖当天分区dt 按日
增量接口追加,带批次号dt 加 batch
CDC 日志按变更顺序追加dt,必要时加 hh
文件投递按到达批次落分区dt 加 batch
ODS 直接 UPDATE 或 DELETE 历史分区后审计断档,出问题也无法还原源端当时提供的值;需要修正时用新批次追加,而不是改旧分区。
快照与增量两种模式不要混在一张表里:同一张表既有每日全量快照又有增量行,下游无法判断该按哪种语义读取,重复计算几乎必然发生。
分区粒度要与源端交付节奏一致:源端每天一次全量就按日落分区,源端每小时推送就按小时落分区,粒度定粗会丢失批次辨识度,定细会让分区数与文件数无谓增长。

易错点

  • ODS 直接删改历史分区:审计断档,事后无法还原源值
  • 全量快照与增量数据混入同一张表:下游读取语义不明确,容易重复或漏算
  • 快照表没有保留策略:每日全量不断累积,存储成本线性上涨
  • 增量重跑时再次追加而不是覆盖原批次分区:同批数据重复入仓,下游计数直接翻倍

数据来源与参考

  • Hive 官方文档:LanguageManual DML
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌