历史与增量处理要解决的问题是:面对新增、更正、属性变化和迟到数据,持续形成可解释的结果,并保留业务需要的历史。
"每天只处理新数据"不能完整定义增量。旧记录可能被更正,昨天发生的事件今天才到,商品分类也可能发生变化。
《数据仓库工具箱》分别讨论缓慢变化维度、迟到数据、历史加载和增量处理。本文将它们按问题关系串联,不把"历史与增量"冒称为作者命名的一套统一步骤。
一、先确定要解释哪一种历史
历史要求首先是业务选择。用户可能想按交易当时的商品分类复盘,也可能想按今天的组织结构重看过去。这两个问题需要不同的解释方式。
原书在SCD中介绍类型1重写、类型2增加新行等选择。类型1反映最新属性;类型2为变化增加版本,保留事实发生时的背景。并非每个属性都必须采用同一种策略。
例如,修正无意义的拼写错误和记录商品真实改类,业务含义不同。应按属性与分析用途确定策略,而不是给整张维表机械贴一个类型标签。
完成这一环节,需要说明哪些变化保留、哪些覆盖,以及用户怎样识别所查询的历史视角。
二、再区分事件发生与数据到达
业务发生时间说明事实属于何时,入仓时间说明数仓何时知道它。两者不同,晚到也不等于新发生。
原书讨论迟到事实和迟到维度:事实到达时,可能需要找到其发生时适用的维度版本;维度缺失时则需要约定等待、临时成员或后续修正策略。
教学例子:周一支付135元,周三成功退款45元,退款记录周五才到仓。周三业务上已发生退款,但周四的数据发布可能还未包含它。
因此,结果需要区分观察截止和数据截止。保留发布版本、说明完整性及修订,是我们为这一场景补充的工程设计,不是原书固定字段方案。
三、先建立历史基线,再接续增量
原书第20章区分一次性历史加载和日常增量。历史加载建立初始事实与维度,增量需要识别新增、变化和删除,并自动处理后续更新。
历史与增量的连接边界必须明确:从哪个位置开始接续、怎样避免遗漏或重复,以及是否能够重新取得来源变化。
时间戳、变化标识、CDC或快照比较各有适用条件。若来源会更正旧订单,只按订单创建日期读取当天数据,就会漏掉更正。
选择依据来自来源的变化机制与历史要求。增量不等于固定使用一个更新时间字段,更不等于永远只改当天分区。
四、把变化传播到受影响结果
识别变化之后,需要判断影响范围。迟到退款可能同时改变退款明细、原活动订单组净额及对应汇总。
先保留事件身份和可重放输入,再按明确规则更新目标,并同步修正受影响的派生结果。本文将"同一输入重复处理不增加额外业务效果"作为幂等检查,这属于实践扩展。
维度历史修订也可能影响既有事实的版本关联;究竟需要追溯更新哪些事实,应由业务生效时间和历史策略决定。
如果只能确认有限的修正范围,应明确限制并核查,而不是无依据地全量重算,或只修明细、让下游继续显示旧数。
五、怎样验证历史与增量正确
构造正常新增、重复到达、旧记录更正、迟到事件和维度缺失等输入,检查结果是否符合规则。
在来源与历史信息足够、且使用相同定义的条件下,可以比较增量处理结果与参考重建结果。若缺少原始变更历史,就不能假装可以完整还原过去。
同样要检查历史查询是否漂移、重复处理是否算重、修订后下游是否同步。任务完成只说明流程执行,需要业务结果验证来确认更新可靠。
快速复习
定义历史视角 → 区分发生与到达 → 连接历史基线和增量 → 识别并传播变化 → 验证重放与历史解释。
关键反例:周五到仓的退款,不应因为今天才收到就被误认作周五发生;归属旧活动时,也不能只刷新周五汇总。
原书入口与边界
《数据仓库工具箱》第3版2.5,书内35---36页、PDF57---58页;19.5.8迟到处理,书内338页、PDF360页起;20.3历史加载,PDF378页起;20.4增量,书内363页、PDF385页起。
SCD、迟到处理及历史/增量区分来自原书;发布版本、幂等验证与影响范围检查是本文串联的实践解释,具体实现需核对实际来源和引擎。