维度建模之缓慢渐变维

在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中,特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题:业务数据库中的一些数据发生了更改,到底要不要将这些变化也反映到数据仓库中?在数据仓库中,哪些数据应该随之变化,哪些可以不用变化?考虑到这些变化,在数据仓库中的维度表又应该如何设计以满足这些需要。

  1. 每天保存当前数据的全量快照数据,该方案适合数据量较小的维度,使用简单的方式保存历史状态

  2. 在维表中添加关键属性值的历史字段,仅保留上一个的状态值

  3. 拉链表

什么是缓慢渐变维?

维度数据会随着时间发生变化,变化速度比较缓慢,这种维度数据通常称作缓慢渐变维;由于数据仓库需要追溯历史变化,尤其是一些重要的数据,所以历史状态也需要采取一定的措施进行保存。

比如顾客的联系方式,手机号码等信息可能随着顾客的所在地的更改发生变化,比如商品的价格在不同时期有上涨和下降的变化。那么在业务数据库中,很自然的就会修改并马上反映到实际业务当中去。但是在数据仓库中,其数据主要的特征一是静态历史数据,二是少改变不删除,三是定期增长,其作用主要用来数据分析。

拉链表

当数据发生变化时,将旧数据置为失效,将更改后的数据当作新的记录插入到维度表中,并开始生效,这样能够记录数据在某种粒度上的变化历史。

维度拉链表:

如下所示:


其中start_date为生效时间,end_date为失效时间。查询有效数据如下语句

Select * from user where start_date<= 2018-05-22 and end_date>= 2018-05-22

因为是对维度表做拉链,所以同一个维度实体必然存在多条记录,此时维度表的原子性主键就不存在了,可以使用添加代理键的方式实现维度表和事实表的关联。

事实表装载代理键(含缓慢渐变维)

如下是订单事实表和用户维度表(含代理键):

事实表中历史的用户维度ID不会发生变化,所以事实表的代理键加载仅发生在新增数据上。

-- 事实表装载代理键
select ta.*,tb.uid
from fact_order as ta
join (select *fromdim_user as tbwhere '${bizDate}' >= start_date and '${bizDate}' <= end_date
) as tb
on ta.id = tb.id注意:
${bizDate}为时间限定,每天增量表可取到当天。如20191204...代理键是维度建模中极力推荐的方式,它的应用能有效的隔离源端变化带来的数仓结构不稳定问题,同时也能够提高数据检索性能但是如所见,代理键维护代价非常高,尤其是数据装载过程中,对事实表带来了较大的影响,在基于hive的数据仓库建设影响更加严重,比如代理键的生成、事实表中关联键的装载、不支持非等值关联等问题,带来ETL过程更加复杂故,在大数据体系下,谨慎使用代理键,同时对于缓慢渐变维场景,可以考虑用空间换取时间,每天保留维表全量快照;但这样会带来存储成本,根据实际情况衡量

事实拉链表:

当事实表数据量大,但数据是缓慢变化,需要跟踪历史状态,和缓慢渐变维类似,需要用到事实拉链表。

如:信用卡场景,由于用户的信用额度、已用额度存在缓慢的变化,又需要跟踪变化的记录,设计相关事实表。

​ 源数据包括(credit_amount):用户id、卡id、额度、已用额度、剩余额度、创建时间、更新时间

  • 增量事实拉链表

    -- 伪代码仅供参考
    -- 1.增量采集数据
    insert into s_credit_amount
    select *
    from  credit_amountwhere updated_time>='2019-12-01 00:00:00'
    -- 2.dwd层拉链表设计 d_credit_amount_l(l表示拉链表)
    drop table if exists tmp_credit_amount;
    create table tmp_credit_amount as
    select *
    from (selectta.card_id, -- 卡IDta.user_id, -- 用户IDta.amount, -- 额度ta.used_amount, -- 已用额度ta.created_time, -- 创建时间ta.updated_time, -- 更新时间ta.start_date, -- 拉链表(开始时间)(case when tb.card_id is not null and ta.end_date>'2018-06-01' then '2018-05-31' else ta.end_date end) as end_date, -- 拉链表(失效时间)load_time -- 方便排查问题fromd_credit_amount_l as taleft joins_credit_amount as tbon ta.card_id=tb.card_idunion all -- union 发生变化的数据select ta.card_id, -- 卡IDta.user_id, -- 用户IDta.amount, -- 额度ta.used_amount, -- 已用额度ta.created_time, -- 创建时间ta.updated_time, -- 更新时间'2019-10-04' as start_date, -- 拉链表(开始时间)'9999-12-31' as end_date, -- 拉链表(失效时间)unix_timestamp() as load_time  -- 数据生成时间froms_credit_amount as ta
    )tmpinsert overwrite into d_credit_amount_l
    select * from tmp_credit_amount;备注:首先查询增量数据中变化的数据更改end_date置为失效状态,再union关联新增数据。
  • 全量事实拉链表

    -- 伪代码仅供参考
    selectta.*
    from(selectta.card_id,ta.user_id,ta.amount,ta.used_amount,ta.created_time,-- 捕获数据变化md5(concat(card_id,user_id,amount,used_amount,created_time)) as md5_flagfrom d_credit_amount_d as ta where dt='2019-12-05')ta
    left join(selectta.card_id,ta.user_id,ta.amount,ta.used_amount,ta.created_time,md5_flagfrom d_credit_amount_d as ta where dt='2019-12-04')tb
    on ta.card_id=tb.card_id
    where ta.md5!=tb.md5 or tb.card_id is null备注:可以根据重要属性,进行md5加密确认唯一一条数据(可根据MD5判断改变数据)。
    

    关注公众号 数据工匠记 ,专注于大数据领域离线、实时技术干货定期分享!个人网站 www.lllpan.top

维度建模之缓慢渐变维相关推荐

  1. blog-数据仓库维度建模系列--缓慢变化维(SCD)的思考(一)

    缓慢变化维(Slowly Changing Dimensions) 缓慢变化维是维度技术中用于描述维度变化情况的一种分类. 什么是SDC? 在现实的实施中 先说一下缓慢变化维的概念.缓慢变化维(Slo ...

  2. 关于解决缓慢渐变维的3种方式

    什么是渐变维?        维度可以根据变化剧烈程度主要分为 无变化维度 和 变化维度 .例如一个人的相关信息,身份证 号.姓名和性别等信息数据属于不变的部分:而婚姻状态.工作经历.工作单位和培训经 ...

  3. 大数据和Hadoop时代的维度建模和Kimball数据集市

    维度建模已死? 在回答这个问题之前,让我们回头来看看什么是所谓的维度数据建模. 为什么需要为数据建模? 有一个常见的误区,数据建模的目的是用 ER 图来设计物理数据库,实际上远不仅如此.数据建模代表了 ...

  4. 缓慢渐变维度的处理方式

    维度可以根据变化剧烈程度主要分为无变化维度.缓慢变化维度和剧烈变化维度.例如一个人的相关信息,身份证号.姓名和性别等信息数据属于不变的部分,政治面貌和婚姻状态属于缓慢变化部分,而工作经历.工作单位和培 ...

  5. 企业级数据仓库:数据仓库概述;核心技术框架,数仓理论,数据通道Hive技术框架,HBase设计,系统调度,关系模式范式,ER图,维度建模,星型/雪花/星座模式,数据采集同步,业务数据埋点,数据仓库规范

    文章目录 第一章 数据仓库概述 1.1 数据仓库简介 1.1.2 什么是数据仓库? 1.1.3 OLTP 与 OLAP 1.2 数据仓库技术架构 1.3 课程目标 第二章 核心技术框架 2.1 数据仓 ...

  6. 大数据基础知识——数仓的搭建(维度建模)

    数据仓库 文章目录 数据仓库 数据仓库的介绍: 数据仓库的概念: OLTP和OLAP区别: 数据仓库的特点: 面向主题: 数据集成: 非易失: 时变: 数据仓库系统架构 系统结构图 源数据 ETL 数 ...

  7. 数据仓库(二)之维度建模篇

    概述 维度建模是一种将数据结构化的逻辑设计方法,它将客观世界划分为度量和上下文.度量是常常是以数值形式出现,事实周围有上下文包围着,这种上下文被直观地分成独立的逻辑块,称之为维度.它与实体-关系建模有 ...

  8. 数仓维度建模之维度表技术基础

    数仓维度建模之维度表技术基础 01 维度表结构 组成结构: 主键 + 维度属性 名词解释: 主键:作⽤是与事实表的外键进⾏关联. 维度属性:是⽤于描述维度特性的字段,⼀般作为 group by分组查询 ...

  9. 数据仓库2_数据建模_维度建模

    目录 0 参考列表 1 维度建模 1.1 多维体系结构 1.1.1 总线矩阵(业务矩阵) 1.1.2 一致性维度 1.1.3 一致性事实 1.2 建模模式 1.2.1 星型模式 1.2.2 雪花模式 ...

最新文章

  1. 2022-2028年中国环保服务业投资分析及前景预测报告
  2. 【转】文件读写NDK(或Linux)
  3. Android之让EditText不被键盘挡住
  4. 计算机二级access知识点6,2019年计算机二级ACCESS考试知识点:关系数据模型
  5. 祝贺JeecgBoot获评为2019年度最受欢迎中国开源软件
  6. R7-5 求矩阵各行元素之和 (15 分)
  7. AMP、HMP、SMP
  8. 【BZOJ3601】一个人的数论,莫比乌斯反演+高斯消元
  9. 关于一道面试题,使用C#实现字符串反转算法
  10. [程序设计]C++中extern “C”含义深层探索(转载)
  11. python机器学习库sklearn——DBSCAN密度聚类
  12. 创建数据库、表以及索引
  13. Java核心技术(基础知识一)
  14. 梦龙即时通讯软件测试自学,梦龙网络计划教程.pdf
  15. ESP32(NodeMCU-32S)简单实现路由中继/wifi中继
  16. 程序员如何修炼自己的九阳神功
  17. 第二章(第四部分) 黑暗之王的分身
  18. 《Unity》 向量四元数以及常用数学公式
  19. python自动发送短信验证码、短信通知、营销短信、语音短信
  20. 如何去除图片中的白色背景(变透明)

热门文章

  1. java.io.UTFDataFormatException: encoded string too long: 270976 bytes
  2. 双系统开机 进入grub resource,并且进不bios
  3. 企业宣传型小程序特点-微信小程序开发-视频教程23
  4. NK-RTU980 USB bulk传输
  5. python stdin stdout_Python子进程:给出stdin,读取stdout,然后给出更多stdin
  6. PreScan快速入门到精通第三十二讲基于PreScan进行毫米波雷达传感器仿真
  7. oCPC实践录 | oCPC产品设计与出价原理(1)
  8. 谷歌大小写转换_如何轻松更改Google文档中文本的大小写
  9. 采用顺序存储实现队列的初始化、入队、出队操作。/验证实验/
  10. RFID固定资产管理系统全生命周期管理办公资产