一、拉链表基础
缓慢渐变维:维度会随着时间发生缓慢的变化。
处理方式:
-
全量快照
-
拉链表
全量快照很简单,今天我们来看看拉链表。。。
拉链表是处理缓慢渐变维的一种方式,它区别于正常的表而言,会多两个字段,start_date和end_date,代表这条数据的起始时间和结束时间。
如:James同学哪天想不开了,他从男的变成了女的。
id | name | sex | dept | Start_date | End_date |
James | hsl | 男 | 001 | 20200101 | 20200821 |
James | hsl | 女 | 001 | 20200822 | 99991231 |
适用场景:数据会发生变化,但是大部分不变。比如:用户维度表、信用卡的用户额度等
优点:节约存储
缺点:维护成本大,有一定学习成本
二、实现(基本代码)
Talk is cheap. Show me the code
INSERT OVERWRITE TABLE dwd_user_info_df PARTITION (ds='20200822')
SELECT
id
,nick_name
,phone_num
,gender
,create_time
,update_time
,'20200822' AS start_date
,'99991231' AS end_date
FROM
ods_user_info_di -- T-1增量
WHERE
ds='20200822'
UNION ALL
SELECT
a.id
,a.nick_name
,a.phone_num
,a.gender
,a.create_time
,a.update_time
,a.start_date
,(CASE WHEN b.id IS NOT NULL AND a.end_date = '99991231' THEN '20200821' ELSE a.end_date END) AS end_date --修改T-2全量发生状态变化的数据
FROM
(
SELECT
id
,nick_name
,phone_num
,gender
,create_time
,update_time
,start_date
,end_date
FROM
dwd_user_info_df --T-2全量
WHERE
ds = '20200821'
)a
LEFT OUTER JOIN
(
SELECT
id
,nick_name
,phone_num
,gender
,create_time
,update_time
FROM
ods_user_info_di -- T-1 增量
WHERE
ds='20200822'
)b
ON a.id = b.id;
--删除T-3分区数据,保存最近两天的分区即可,若不删除,存储比全量快照还要大,失去使用拉链表的的意义
ALTER TABLE dwd_fyp_user_info_df DROP IF EXISTS PARTITION(biz_date='20200820');