数仓-维度模型之维度迟到问题处理详解
数仓-维度模型之维度迟到问题处理详解
摘要:在数据仓库项目中,从贴源层(ODS)更新到数据仓库层(DW)时,出现了拉链形式的维表数据更新不及时的情况,从而导致事实表中的该维度列值为空或旧值。需要根据维表数据更新的时间,将事实表中数据纠正。
关键词:数据仓库 离线数仓 维度迟到 退链 ODS DW 拉链表 缓慢变化 SCD2
问题示例
问题背景:数据源中有商品表、用户表和订单表,业务流程为从数据源加载数据到ODS层,之后在DW层进行维度建模,分为商品维度表(缓慢变化),用户维度表(缓慢变化),订单事实表(事务、增量)。
问题:业务上,商品苹果单价在2021-03-25由5更改为10,但是数据源中的商品表更新日期为2021-04-05,滞后于业务,检查发现之后,将数据源中的最近更新日期纠正为2021-03-25。在常规的数仓更新操作中,无法处理该错误,因此需要对数仓中的数据进行修正。
===========================================================================================
修正前表数据:
ODS层
商品表
商品id | 商品名称 | 商品单价 | 最近更新日期 |
---|---|---|---|
1 | 苹果 | 10 | 2021-04-05 |
2 | 香蕉 | 2 | 2021-03-04 |
3 | 葡萄 | 15 | 2021-03-04 |
用户表
用户id | 用户名称 | 用户手机号 | 最近更新日期 |
---|---|---|---|
1 | 张三 | 123 | 2021-01-04 |
2 | 李四 | 234 | 2021-01-04 |
3 | 梅有钱 | 345 | 2021-01-04 |
4 | 刘首富 | 456 | 2021-01-04 |
订单表
订单id | 用户id | 商品id | 商品数量 | 订单日期 |
---|---|---|---|---|
1 | 1 | 1 | 3 | 2021-03-10 |
2 | 2 | 1 | 4 | 2021-03-20 |
3 | 3 | 1 | 5 | 2021-04-03 |
4 | 1 | 1 | 6 | 2021-04-20 |
DW层
商品维度表
商品代理键 | 版本号 | 商品id | 商品名称 | 商品单价 | 生效日期 | 失效日期 |
---|---|---|---|---|---|---|
0 | 1 | NULL | NULL | NULL | 2021-01-01 | 9999-12-31 |
1 | 1 | 1 | 苹果 | 5 | 2021-01-01 | 2021-04-05 |
2 | 1 | 2 | 香蕉 | 2 | 2021-01-01 | 9999-12-31 |
3 | 1 | 3 | 葡萄 | 15 | 2021-01-01 | 9999-12-31 |
4 | 2 | 1 | 苹果 | 10 | 2021-04-05 | 9999-12-31 |
用户维度表
用户代理键 | 版本号 | 用户id | 用户名称 | 用户手机号 | 生效日期 | 失效日期 |
---|---|---|---|---|---|---|
0 | 1 | NULL | NULL | NULL | 2021-01-01 | 9999-12-31 |
1 | 1 | 1 | 张三 | 123 | 2021-01-04 | 9999-12-31 |
2 | 1 | 2 | 李四 | 234 | 2021-01-04 | 9999-12-31 |
3 | 1 | 3 | 梅有钱 | 345 | 2021-01-04 | 9999-12-31 |
4 | 1 | 4 | 刘首富 | 456 | 2021-01-04 | 9999-12-31 |
订单事实表
订单id | 用户代理键 | 商品代理键 | 商品数量 | 订单日期 |
---|---|---|---|---|
1 | 1 | 1 | 3 | 2021-03-10 |
2 | 2 | 1 | 4 | 2021-03-20 |
3 | 3 | 1 | 5 | 2021-04-03 |
4 | 1 | 1 | 6 | 2021-04-20 |
修正步骤:
经分析可得,需要修正的表为ODS层的商品表和DW层的商品维度表、订单事实表。
1.更新ODS层的商品表
按照常规的更新步骤,从数据源全量同步商品表,更新后数据如下:
苹果的最近更新日期得到更正。
商品表
商品id | 商品名称 | 商品单价 | 最近更新日期 |
---|---|---|---|
1 | 苹果 | 10 | 2021-03-25 |
2 | 香蕉 | 2 | 2021-03-04 |
3 | 葡萄 | 15 | 2021-03-04 |
2.回退DW层的订单事实表
订单事实表,通过商品代理键与商品维度表联表查询,对于涉及到的商品信息,删除订单日期大于2021-03-24的行,删除后数据如下:
订单id为3和4的订单行被删除。
订单事实表
订单id | 用户代理键 | 商品代理键 | 商品数量 | 订单日期 |
---|---|---|---|---|
1 | 1 | 1 | 3 | 2021-03-10 |
2 | 2 | 1 | 4 | 2021-03-20 |
3.回退DW层的商品维度表
商品维度表是拉链表,因此需要退链操作,将涉及到的商品信息回溯到错误发生前,即2021-03-24。
1> 商品维度表中,对于涉及到的商品信息,删除生效日期大于2021-03-24的行,删除后数据如下:
商品代理键为4的商品信息被删除。
商品维度表
商品代理键 | 版本号 | 商品id | 商品名称 | 商品单价 | 当前是否有效 | 生效日期 | 失效日期 |
---|---|---|---|---|---|---|---|
0 | 1 | NULL | NULL | NULL | 是 | 2021-01-01 | 9999-12-31 |
1 | 1 | 1 | 苹果 | 5 | 否 | 2021-01-01 | 2021-04-05 |
2 | 1 | 2 | 香蕉 | 2 | 是 | 2021-01-01 | 9999-12-31 |
3 | 1 | 3 | 葡萄 | 15 | 是 | 2021-01-01 | 9999-12-31 |
2>商品维度表中,对于涉及到的商品信息,将失效日期大于2021-03-24的行的失效日期置为9999-12-31,更新后数据如下:
商品代理键为2的商品信息失效日期被修改。
商品维度表
商品代理键 | 版本号 | 商品id | 商品名称 | 商品单价 | 当前是否有效 | 生效日期 | 失效日期 |
---|---|---|---|---|---|---|---|
0 | 1 | NULL | NULL | NULL | 是 | 2021-01-01 | 9999-12-31 |
1 | 1 | 1 | 苹果 | 5 | 是 | 2021-01-01 | 9999-12-31 |
2 | 1 | 2 | 香蕉 | 2 | 是 | 2021-01-01 | 9999-12-31 |
3 | 1 | 3 | 葡萄 | 15 | 是 | 2021-01-01 | 9999-12-31 |
4.更新DW层的商品维度表
在第3步中,商品维度表回退到了2021-03-24,在此重新更新,更新后数据如下:
商品维度表
商品代理键 | 版本号 | 商品id | 商品名称 | 商品单价 | 当前是否有效 | 生效日期 | 失效日期 |
---|---|---|---|---|---|---|---|
0 | 1 | NULL | NULL | NULL | 是 | 2021-01-01 | 9999-12-31 |
1 | 1 | 1 | 苹果 | 5 | 否 | 2021-01-01 | 2021-03-25 |
2 | 1 | 2 | 香蕉 | 2 | 是 | 2021-01-01 | 9999-12-31 |
3 | 1 | 3 | 葡萄 | 15 | 是 | 2021-01-01 | 9999-12-31 |
1234 | 2 | 1 | 苹果 | 10 | 是 | 2021-03-25 | 9999-12-31 |
5.更新DW层的订单事实表
在第2步中,订单事实表回退到了2021-03-24,在此重新(增量)插入涉及到的商品的2021-03-24之后的订单数据,更新后数据如下:
订单事实表
订单id | 用户代理键 | 商品代理键 | 商品数量 | 订单日期 |
---|---|---|---|---|
1 | 1 | 1 | 3 | 2021-03-10 |
2 | 2 | 1 | 4 | 2021-03-20 |
3 | 3 | 1234 | 5 | 2021-04-03 |
4 | 1 | 1234 | 6 | 2021-04-20 |
===========================================================================================
小结
以上为单一维度迟到的处理方式,当商品表和用户表都有迟到情况时,处理方式类似。另外,在此基础上,还有一种情况,事实表为“无事实的事实表”,且为拉链表,则需要在第2步对该事实表进行退链操作,在第5步之后,事实表更新的生效日期为前一天,因此需要将失效日期为今天的行的失效日期改为正确日期,并将生效日期为今天的行的生效日期改为正确日期。
注意:
1.涉及到手工修正的情况比较复杂,请务必在更新或删除时,加限制条件。如果无限制条件,则对所有数据进行回退或插入操作。
2.无事实的事实表是指,在某些情况下,需要记录某事物的状态变化,且变化字段较多但不适宜作为维度表时,可以建立事实表记录其状态变化。特点:字段不包含度量值;包含时间字段。例1,在人力项目中,将岗位、职务、企业等组合作为岗位状态维度,将用户信息作为维度,建立用于记录员工每天的岗位状态的事实表,每天记录一次,为缩减数据量,一般采用拉链表做处理,包含岗位状态代理键、员工信息代理键、生效时间、失效时间等字段。模型建立之后,即可查询任意日期时某员工的岗位状态/个人信息,或统计任意日期某岗位的人数占比等指标。例2,由于订单事实表只记录了有订单的情况,无法得知在促销期间有多少商品未出售,因此需要建立记录每日商品的事实表。当需要查询未出售商品是,将商品事实表和订单事实表关联,取差集,即可得出期间未售出的商品。
数仓-维度模型之维度迟到问题处理详解相关推荐
- 大数据基础知识——数仓的搭建(维度建模)
数据仓库 文章目录 数据仓库 数据仓库的介绍: 数据仓库的概念: OLTP和OLAP区别: 数据仓库的特点: 面向主题: 数据集成: 非易失: 时变: 数据仓库系统架构 系统结构图 源数据 ETL 数 ...
- Tribon模型数据抽取之sx700.exe详解
Tribon模型数据抽取之sx700.exe详解 一:简介 网络上关于Tribon模型数据抽取的论文最早流传的是2006哈尔滨工程大学姚竞争的工学硕士学位论文<TRIBON模型的数据抽取及二次开 ...
- 数据仓库知识点总结(数仓分层建模、维度建模等)
数据仓库知识点总结 推荐学习<华为数据之道><数据仓库工具箱-维度建模权威指南>两本书. 此文档是数据仓库建模的知识点总结文档,在持续更新中(2021-10-13). 文章目录 ...
- 数仓_范式建模/维度建模
范式建模 Third Normal Form,3NF 是数据模型常用的一个方法,主要解决关系型数据库的数据存储. 目前关系型数据库的建模方法,大部分采用三范式建模,即通过实体关系(Entity Rel ...
- 吴乙己的数仓指南_5.1维度建模技巧之SCD2类型缓慢变化维搭建
目录 0.引言 1.SCD类型 2.举个栗子 3.SCD2 3.1 什么是SCD2 3.2 如何使用SCD2 3.3 如何实现SCD2 3.3.1 获取维度基准 3.3.2 按情况分治打标 3.3.3 ...
- 【电商数仓】数仓搭建之DIM维度层(商品、优惠券、活动、地区、时间维度表)
文章目录 零 DIM层最终建模结果 一 商品维度表(全量) 1 商品维度表 2 建模过程分析 3 建表语句 4 装载数据 (1)逐步分析 (2)完整装载sql 二 优惠券维度表(全量) 1 建表语句 ...
- 数仓分层模型架构分享(3)
文章在京东系数据仓库建设方案的基础上,加上自己独特的理解,很能给人以参考和启发. 原作者:hxiao1317098 原文:https://blog.csdn.net/hxiao1317098/arti ...
- 一点就分享系列(实践篇6——上篇)【迟到补发_详解yolov8】Yolo-high_level系列融入YOLOv8 旨在研究和兼容使用【3月份开始持续补更】
一点就分享系列(实践篇5-补更篇)[迟到补发]-Yolo系列算法开源项目融入V8旨在研究和兼容使用[持续更新] 题外话 [最近一直在研究开放多模态泛化模型的应用事情,所以这部分内容会更新慢一些,文章和 ...
- 手把手教你玩转SOCKET模型:完成端口(Completion Port)详解
这篇文档我非常详细并且图文并茂的介绍了关于网络编程模型中完成端口的方方面面的信息,从API的用法到使用的步骤,从完成端口的实现机理到实际使用的注意事项,都有所涉及,并且为了让朋友们更直观的体会完成端口 ...
最新文章
- python null byte_如何以“正确”的方式处理带有nullbytes的Python unicode字符串?
- C#各种小知识点总结
- 如何查看计算机配置和名称,如何查看电脑本机配置和跑分
- Android Activity学习笔记——Activity的启动和创建
- 纪中B组模拟赛总结(2019.12.21)
- DDMS工具使用(转)
- CentOS 7安装mysql
- Android Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x10 in tid 5287 (HeapTaskDaemo
- H3C nqa 配置
- 人工智能:一种现代的方法 书本课后习题解答
- 云空间为您提供10G免费全能空间
- 2018计算机三级网络技术百度云,百度网盘2018旧版
- 计算机中什么不可打印,电脑不能打印怎么办
- 一起学Go吧! Go语言反射篇
- HyperLedger Fabric - 超级账本(2.2)启动网络 - 手动
- C语言面试篇(一)总结
- 如何选购台式电脑和笔记本?购买时应注意什么
- 奇妙数字(数论)题解
- CODESYS在工厂自动化中的应用:伊顿穆勒模块化控制器XC200
- [转]Go 的垃圾回收机制在实践中有哪些需要注意的地方?