拉链表的学习

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

拉链表的学习

上一篇:[SAA + SAP] 16. RDS


下一篇:测试报告生成脚本