1、代理键
维度表中必须有一个能够唯一标识一行记录的列,通过该列维护维度表与事实表之间的关系,一般在维度表中符合条件的业务主键可以当作维度主键。
然而当整合多个数据源的维度时,不同数据源的业务主键重复问题如何解决?涉及维度拉链表时,同一主体存在多条记录,业务键重复怎么解决?
此时就需要引入代理键,代理键是由数据仓库处理过程中产生的、与业务本身无关的、唯一标识维度表中一条记录并充当维度表主键的列,也是描述维度表与事实表关系的纽带,所以在设计有代理键的维度表中,事实表中的关联键是代理键而不是原有的业务主键,即业务关系是靠代理键维护,这样有效避免源系统变化对数仓数据产生影响。
在实际业务中,代理键通常是数值、自增值类型,在传统数据库中有自增id,那在hive中怎么生成自增的代理键呢?
如上图所示,db1和db2库各有一张stu学生信息表,将两张表数据进行整合时,出现了id冲突的问题,此时可通过代理键来解决,可通过以下方式合并两张表数据并生成代理键:
insert overwrite table db1.dim_stu partition(dt='2020-02-17')
select
tb.id
,tb.name
,tb.sex
,tb.grade
,tb.school
,row_number() over(order by id)+ta.max_id as gid
from
(select
id
,name
,sex
,grade
,school
from db1.stu
union all
select
id
,name
,sex
,grade
,school
from db2.stu
) tb
cross join
(select
nvl(max(gid),0) as max_id
from db1.dim_stu where dt='2020-02-16'
)ta
union all
select
id
,name
,sex
,grade
,school
,gid
from db1.dim_stu where dt='2020-02-16';
2、缓慢渐变维
维度数据会随着时间发生变化,变化速度比较缓慢,这种维度数据通常称作缓慢变化维,由于数据仓库需要追溯历史变化,尤其是一些重要的数据,所以历史状态也需要采取一定的措施进行保存,常用方法有以下三种:
(1)每天保存当前数据的全量快照数据,该方案适合数据量较小的维度,使用简单的方式保存历史状态
(2)在维表中添加关键属性值的历史字段,仅保留上一个的状态值
(3)拉链表
当维度数据发生变化时,将旧数据置为失效,将更改后的数据当作新的记录插入到维表中并开始生效,这样能够记录数据在某种粒度上的变化历史。但因为是对维度表做拉链,所以同一个维度实体必然存在多条记录,此时维度表的原子性主键就不存在了,维度设计中不建议使用拉链表,维护成本较高,拉链表如下所示:
这种情况下,拉链表怎么和事实表关联呢?
这就需要在事实表中装载代理键,而事实表来源于业务事务表,代理键和业务本身没有关系,那怎么在事实表中装载代理键?
事务表中历史的用户维度ID不会发生变化,所以只需对事实表中每日新增数据装载代理键即可。
根据上图关系,向销售记录事实表中装载代理键,代码如下:
insert overwrite table fact_record partition(dt='2020-02-17')
select
ta.order_id
,ta.emp_id
,tb.emp_uid
,ta.pro_type
,ta.trans_amount
,ta.create_date
from
(select
order_id
,emp_id
,pro_type
,trans_amount
,create_date
from sale_record
) ta
join dim_emp as tb on ta.emp_id = tb.emp_id
where create_date >= start_date and create_date <= end_date;
代理键是维度建模中很有效的一种方式,它能有效隔离源端变化带来的数仓结构不稳定问题,同时也能够提高数据仓库检索性能。
但是代理键维护代价非常高,尤其是数据装载过程中,对事实表带来了较大的影响,比如代理键的生成、事实表中关联键的装载、不支持非等值关联等问题,这将导致ETL过程更加复杂,所以在大数据体系下,谨慎使用代理键,同时对缓慢渐变维场景,可以考虑使用空间换时间的方法,每天保留维表全量快照,但这样会带来存储成本的上升,可以根据实际情况衡量。
3、维度拆分
以员工维度为例,公司中技术部会重点关注员工的技术特长,财务部会重点关注员工的入职时间和薪资情况,如果多个部门共用同一张给员工信息维表,则灵活性较差,此时可将员工维表进行拆分,如下图所示,可将员工维表拆分为技术方向的维表和财务方向维表
另外在星座模型中,一张维表经常会被多个事实表使用,也可以对维表进行适当拆分,简化模型。