首页/数据/数仓建模速查/迟到数据的分区修正
维度与事实设计149 条

迟到数据的分区修正

按事件时间分区的事实表收到迟到数据时,重写受影响分区而不是直接 append:先锁定受影响日期集合,再整分区替换。

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

迟到数据怎么修正

按事件时间分区的事实表收到迟到数据时,不能简单追加,而要重写受影响分区。标准动作是先把迟到记录按它原本所属的日期分组,锁定受影响的分区集合,再用动态分区覆盖写入整个分区。范围能收窄就收窄:一次纠正重写半个月分区,既浪费资源,也会把没有问题的日期一起重算,风险成倍放大。

基本信息

处理策略重写受影响分区,而非追加
核心语法INSERT OVERWRITE TABLE ... PARTITION (dt)
影响范围迟到数据所属日期去重后的集合
执行前置备份受影响分区或依赖快照隔离
执行后校验行数、唯一键、与上游明细核对

典型使用场景

  • 移动端埋点延迟上报:昨天的行为数据今天才到
  • 第三方对账文件延迟:T 加 1 甚至 T 加 2 才拿到明细
  • 上游系统故障补推:停机恢复后批量重推数小时数据
  • 跨时区业务:海外站数据按北京时间分区会天然迟到
  • 人工补录:运营后台补录历史订单需要回写原日期分区

动态分区重写

动态分区重写
-- 先确认受影响日期集合,再整分区覆盖
SELECT DISTINCT dt AS affected_dt FROM stg_order_late;

INSERT OVERWRITE TABLE dwd_order PARTITION (dt)
SELECT order_id, user_id, amount, update_ts, dt
FROM stg_order_late
WHERE dt IN ('2026-10-09', '2026-10-11');
-- 执行后核对:分区行数与重写前差值应等于迟到记录净增量

三种处理方式对比

方式代价风险
直接追加最低同键多行并存,指标虚高
重写受影响分区中等需快照或备份,期间下游读到中间态
全表重建最高影响面过大,通常没必要
动态分区覆盖要显式限定分区范围:不写条件的动态分区写入会覆盖表中所有同名的分区,把无关日期的数据清空。执行前先跑一次受影响日期清单的确认查询,再执行重写。
重写期间下游若在跑,会读到「部分分区已新、部分仍旧」的中间状态。做法是重写完成后统一通知下游重跑,或在下游读取时按批次日过滤,避免跨日期的不一致结论。

易错点

  • 迟到数据直接追加:同一业务键在事实表出现多行,金额指标翻倍
  • 重写范围给得过大:非受影响日期被一并覆盖,凭空丢失正常数据
  • 动态分区未限定分区列表:写错一次清空全部同名分区,事故面极大
  • 只用事件时间分区却按处理时间取水位:迟到数据永远追不回来
  • 重写期间无人协调下游:报表读到中间状态,被当成业务异动排查

数据来源与参考

  • Spark SQL 参考:动态分区覆写;数仓实践
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌