数仓缓慢渐变维度表设计,另一篇比较好的文章结合实际案例
数仓建设 - 缓慢变化维的10种处理方式_雾岛与鲸的博客-CSDN博客
缓慢渐变维度:
维度数据会随着时间发生变化,变化速度比较缓慢,这种维度数据通常称作缓慢渐变维; 由于数据仓库需要追溯历史变化,尤其是一些重要的数据,所以历史状态也需要采用一定的措施进行保存。
大致分为以下几种实现思路
1) 全量快照:
每天保存当前数据的全量快照数据,该方案适合数据量较小的维度,使用简单的方式保存历史状态。
2)额外数据列保存历史状态
额外增加 (一列/多列) ,保留上一个或多个状态值。
Id | name | dept | Last_dept | … |
1 | jiangtai | Dep1 | Dep3 |
3) 拉链表技术
当维度数据发生变化时,将旧数据置为失效,将更改后的数据当作新的记录插入到维度表中,并开始生效,这样能够记录数据在某种粒度上的变化历史。
结合之前所讲的代理键 ,Uid_org 为原始的业务主键,Uid_agency 为代理键
Uid_agency | Uid_org | name | dept | Start_date | End_date |
1 | 1 | jiangtai | Dep1 | 20180501 | 20180509 |
2 | 1 | jiangtai | Dep2 | 20180510 | 20991231 |
问题1 : 如何从拉链表中获取某一天的数据状态
SELECT *
FROM lalian_table
WHERE start_date <= ‘${bizdate}’ AND end_date >= ‘${bizdate}’
Ext : 缓慢渐变维度
代理键是维度建模中极力推荐的方式,它的应用能有效的隔离源端变化带来的数仓结构的不稳定问题,同时也能够提高数据检索性能。
但是如所见,代理键维护代价非常高,尤其是数据装载的过程中,对事实表带来了较大的影响。在基于HIVE 的数据仓库建设中影响更加严重。比如代理键的生成,事实表中关联键的状态,不支持非等值关联等问题,带来ETL 过程更加复杂。
故在大数据体系下,谨慎使用代理键,同时对于缓慢渐变维场景,可以考虑用空间换取时间,每天保留维度表的全量快照。但是这样会带来存储成本,根据实际情况衡量。