迟到事实是什么
迟到事实指记录晚于它自己的业务发生时间到达数仓:线下门店的小票 T+3 才上传、上游系统积压后批量补推、跨时区业务的日切时间不一致,都会造成这类情况。核心决策是按业务时间还是按到达时间分区。按到达时间分区会让历史分区被反复改写、日报与业务日期错位;按业务时间分区则需要支持回写历史分区,并把迟到窗口与补跑机制显式写进调度。
基本信息
| 分区依据 | 业务时间(biz_date),不是入库时间 |
|---|---|
| 迟到窗口 | 显式声明,如允许 T+3 内补数 |
| 补跑方式 | 按分区幂等 upsert,禁止全表重写 |
| 监控指标 | 每日迟到行数、最长滞后天数、未落地时长 |
| 前置条件 | 事实表保留业务时间字段与唯一业务键 |
典型使用场景
- 线下门店数据 T+N 上传:销售小票滞后于交易日期到达
- 上游系统积压补推:白天中断,晚上一次性把整天的数据送进来
- 跨时区业务:不同地区的日切时间不同,按本地时间对不上
- 人工补录与调账:月末集中补录费用、报销与退款
- 接口重试:对接方在失败后重发,业务时间已过去数天
- 日志迟到:设备侧离线缓存后批量上报
监控与幂等补跑
监控与幂等补跑
-- 1) 监控:今天入库的行里有多少属于历史业务日期
SELECT biz_date, count(1) AS late_rows
FROM fact_order
WHERE dt = current_date
AND biz_date < current_date - interval '1' day
GROUP BY biz_date
ORDER BY biz_date;
-- 2) 幂等补跑:按业务键 upsert,重跑结果一致
MERGE INTO fact_order t
USING stg_order_late s ON t.order_id = s.order_id
WHEN MATCHED THEN UPDATE SET amt = s.amt
WHEN NOT MATCHED THEN INSERT VALUES (s.order_id, s.biz_date, s.amt);分区策略对照
| 策略 | 特点 | 风险 |
|---|---|---|
| 按业务时间分区 | 日报与业务日期对齐,可回溯 | 需要回写历史分区,权限与并发要管 |
| 按到货时间分区 | 写入简单、只追加 | 同一业务日数据散落多分区,日报对不上 |
| 双分区(业务+到达) | 兼顾对齐与追责 | 存储翻倍,模型复杂度上升 |
| 不分区只按时间过滤 | 小体量最简单 | 数据量上来后扫描成本不可控 |
迟到数据被过滤规则静默丢弃,是报表对不上账最常见的根因:白天看着正常,月底补录批次一到才暴露。宁可先落到缓冲区并告警,也不要让不满足条件的行无声消失。