在数据仓库中拉链表的使用

使用场景:

在数据仓库中,拉链表可以用于处理维度表的历史时间变化
优点:使用拉链表的优势在于能够有效地追踪维度属性的历史变化

使用方法:

设计拉链表结构:在维度表中添加拉链表所需字段,如开始日期,结束日期,这些字段用来表示维度属性历史变化情况
初始化拉链表:将维度表的当前数据拷贝到拉链表中,将结束日期设定一个特定的未来日期,表示数据当前有效
新数据插入:当有新数据插入时,更新原始数据结束日期变化为变化前的日期,同时,新增的起始日期变为更新日期

举例说明

全量操作

目标:mysql->ods->dwd
背景:假设今天是2022年6月1号,处理2022年6月1号之前的数据
原始数据:

mysql 这是2022-06-01 的用户表t1
idnameaddresscreate_dateupdate_date
1003张三北京2022-05-302022-05-30
1004李四上海2022-05-012022-05-15
1005王五广州2022-04-012022-04-26
1006赵六深圳2022-06-012022-06-01
select *,'2022-5-31'  as dt from t1 where coalesce(update_date,create_date)<'2022-6-1'
然后把这个筛选结果用sqoop导入ods层
hive.ods.tb_user_ods 表t2
idnameaddresscreate_dateupdate_datedt
1003张三北京2022-05-302022-05-302022-05-31
1004李四上海2022-05-012022-05-152022-05-31
1005王五广州2022-04-012022-04-262022-05-31
导入dwd层
insert into t3 partition(start_date)
--在这里,通过partition(start_date)指定了按照start_date列进行分区。也就是说,新插入的数据将根据start_date的值来确定所属的分区。
select id,name,address,create_date,update_date,'9999-99-99' as end_date,coalesce(update_date,create_date) as start_date from t2
hive.dwd.tb_user_dwd表t3
idnameaddresscreate_dateupdate_datestart_dateend_date
1003张三北京2022-05-302022-05-302022-05-309999-99-99
1004李四上海2022-05-012022-05-152022-05-159999-99-99
1005王五广州2022-04-012022-04-262022-04-269999-99-99

增量操作

目标:mysql->ods->dwd
背景:假设今天是2022年6月2号,处理2022年6月1号的数据
原始数据:

mysql 这是2022-06-02 的用户表
idnameaddresscreate_dateupdate_date
1003张三北京2022-05-302022-05-30
1004李四苏州2022-05-012022-06-01
1005王五广州2022-04-012022-04-26
1006赵六深圳2022-06-012022-06-01
查询上一天增量数据
select *,'2022-06-01' as dt from 用户表 where coalesce(update_date,create_date)='2022-06-01'
idnameaddresscreate_dateupdate_datedt
1004李四苏州2022-05-012022-06-012022-06-01
1006赵六深圳2022-06-012022-06-012022-06-01
把这个结果用sqoop导入ods
hive.ods.tb_user_ods
---------------------------------------------------------------
idnameaddresscreate_dateupdate_datedt
1003张三北京2022-05-302022-05-302022-05-31
1004李四上海2022-05-012022-05-152022-05-31
1005王五广州2022-04-012022-04-262022-05-31
1004李四苏州2022-05-012022-06-012022-06-01
1006赵六深圳2022-06-012022-06-012022-06-01
处理增量数据 t1
select id,name,address,create_date,update_date,'9999=99-99'as end_date,
coalesce(update_date,create_date) as start_date from tb_user_ods
where dt='2022-06-01'

处理旧拉链表

 select
    id,name,address,create_date,update_date,
    case
      when b.id is null then a.end_date -- 没有修改
      when b.id is not null and a.end_date!='9999-99-99' then a.end_date -- 修改的 无效的
      when b.id is not null and a.end_date='9999-99-99' then date_add('2022-06-01', -1) -- 修改的 有效的      
      end as end_date,
      a.start_date
    from 旧拉链表 a left join t1 b on a.id=b.id

在6月2号处理6月1号数据中,修改无效情况没有体现,下面用6月3号处理6月2号数据的拉链表
在这里插入图片描述
将两个表union

新 hive.dwd.tb_user_dwd
idnameaddresscreate_dateupdate_datestart_dateend_date
1003张三北京2022-05-302022-05-302022-05-309999-99-99
1004李四上海2022-05-012022-05-152022-05-152022-05-31
1005王五广州2022-04-012022-04-262022-04-269999-99-99
1004李四苏州2022-05-012022-06-012022-06-019999-99-99
1006赵六深圳2022-06-012022-06-012022-06-019999-99-99

将两个结果放到临时表
清空拉链表数据
将临时表放到拉链表
清空临时表数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值