1.什么是拉链表?
拉链表是属于用来应对缓慢变化维度的解决方案之一
2.拉链表的关键字段:
(1) t_start_date 该记录的生效日期(生命周期开始)
(2) t_end_date 该记录的失效日期(生命周期结束)默认 9999-12-31
3.拉链表的实现:
#Hive场景
1 需要准备一张ODS层的全量表,用来初始化
2 需要创建一张每日的用户更新表
3 确认拉链表的时间粒度,是取每天的最后一个状态,还是取每次更新的状态(流水表)
4.每日的用户更新表的数据获取方案:
1.如果数据源是MySql,可以监听数据的变化,比如Canal,最后合并每日变化,或者最后的状态
2.通过保留两天的切片数据(每天的全量数据),进行比对,不同的数据可以作为每日更新表数据,方法是通过concat所有字段转化为MD5进行比对,再得出不同
3.通过流水表,有每日的流水表
5.拉链表的命名:
xxx_his #拉链表
xxx #原始ods表
xxx_update #每日更新表
6.常用拉链表更新语句:
INSERT OVERWRITE TABLE dws.user_his
SELECT * FROM
(
SELECT A.user_num,
A.mobile,
A.reg_date,
A.t_start_time,
CASE
WHEN A.t_end_time = ‘9999-12-31‘ AND B.user_num IS NOT NULL THEN ‘2017-01-01‘
ELSE A.t_end_time
END AS t_end_time
FROM dws.user_his AS A
LEFT JOIN ods.user_update AS B
ON A.user_num = B.user_num
UNION
SELECT C.user_num,
C.mobile,
C.reg_date,
‘2017-01-02‘ AS t_start_time,
‘9999-12-31‘ AS t_end_time
FROM ods.user_update AS C
) AS T
7.常用查询SQL:
#查询当前所有有效的记录,
select *
from user
where t_end_date = ‘9999-12-31‘
#查询2017-01-02的历史快照
select *
from user
where t_start_date <= ‘2017-01-02’
and t_end_date >= ‘2017-01-02’
#t_end_date =‘9999-12-31‘表示该条记录目前处于有效状态。
8.性能瓶颈:
由于拉链表的数据会不断累加,时间越长数据量越大,这时就会出现性能瓶颈
解决思路:
1 对start_date和end_date做索引
2 创建新表,存储几个月内的拉链表数据用于专门查询
9.拉链表和流水表的区别
拉链表:根据时间粒度来选择记录数据(一般按天,存一条)
流水表:用户每条修改记录都会被保存
学习的原文链接:https://blog.csdn.net/zhaodedong/article/details/54177686