拉链表的制作
作用:主要处理缓慢变化维的业务场景。(用户表、订单表)
简洁版,比较难理解,节省了两张临时表,适用于维度表,数据量不大的情况。
INSERT overwrite table dwd_dim_user_info_his
--数据分两批导入到dwd_dim_user_his
--第一批: old + 更新需要变化的old的数据
SELECT
--左表和右边关联后,右表中为NULL的是不需要更新的数据,否则且左表的end_date为9999-99-99,需要将次字段更新
old.id,
old.name ,
old.birthday ,
old.gender ,
old.email ,
old.user_level ,
old.create_time ,
old.operate_time ,
old.start_date ,
if(new.id is null,old.end_date , if(old.end_date ='9999-99-99',date_sub(dt,1),old.end_date ) )
from dwd_dim_user_info_his old
left join
(
SELECT
*
from ods_user_info
where dt='$do_date'
) new
on old.id = new.id
UNION all
--第二批: ods层同步的新的数据
SELECT
*,'9999-99-99' end_date
from ods_user_info
where dt='$do_date';
基础版,需要创建一张临时表(可以用于事实表,数据量较大,且进行分区的数据。)
第一步需要先选取昨日数据放入dwd_order_info_his表。
拉链表制作总结:
- 选取昨日数据添加开始日期和结束日期作为初始拉链表
- 选取新增数据添加开始日期和结束日期
- 拿初始拉链表 union all [ 初始拉链表 left join 新增变化数据 ]