2023.12.1 --数据仓库之 拉链表

目录

什么是拉链表

为什么要做拉链表?

没使用拉链表:

使用了拉链表:

题中订单拉链表的形成过程

实现语句


什么是拉链表

拉链表是缓慢渐变维的一种解决方案.

拉链表,记录每条信息的生命周期,一旦一条记录的生命周期结束,就重新开始一条新的记录,并把当前日期放入生效开始日期,如果当前信息至今都有效,就在结束日期中填入一个最大值(9999-12-31)

为什么要做拉链表?

拉链表适合于:数据会发生变化,但是大部分是不变的

比如:订单信息从未支付、已支付、未发货、已完成等状态经历了一周,大部分时间是不变化的,如果数据量有定规模,无法按照每天全量的方式保存。

没使用拉链表:

从上图可以看到,如果按照上面那个表的记录方法,因为订单未发货的状态从1月持续到了12月,假如一直都是全量同步的方式,那么未发货这条信息,我们将需要用350多行来记录维护他,但对客户来说,或者维护人员来说,我们关心的是订单状态转换的那一刻,在这期间的信息并不重要,所以这种记录方法这会导致冗余过多

使用了拉链表:

从上图的下面那张图可以看到,原本我们需要用350多行来维护未发货这条状态的信息,使用了拉链表后,我们只需要一行,即可涵盖了1月3日到12月11日这300多天的状态.

题中订单拉链表的形成过程

制作拉链表,简单来说就是在表原本的字段上,再加上两列字段,一个是开始时间,一个是结束时间

然后每天找出新增和变化的订单导入到拉链表中,通过合并初始的表和新增变化的表,就能得到对应的拉链表

实现语句

1.从ods层得到每天更新或者新增的数据表

2.原始拉链表 left join 增量表,如果增量表关联id为null或者原始拉链表end_time不是9999-12-31(9999说明这是最新的状态) ,保留原有数据,否则修改拉链表的end_time为增量表中的start_time 减去 1

3.拿着left join 修改后的拉链数据,直接union all 增量数据集

4.把最新拉链数据保存到临时表中

5.insert overwrite 把数据插入到原始拉链表中

相关推荐
SelectDB6 小时前
Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑
大数据·数据库·python
ApacheSeaTunnel8 小时前
当多表数据涌入,Apache SeaTunnel 如何巧妙化解主键冲突?
大数据·开源·数据集成·seatunnel·技术分享·数据同步
大大大大晴天3 天前
Hudi Metadata Table 与 Hive Sync (HMS)怎么选?
大数据
唐青枫4 天前
MySQL JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
sql·mysql
手可摘星辰7774 天前
一次线上FlinkCDC异常排查复盘
大数据·flink
大大大大晴天4 天前
Hudi技术内幕:Metadata Table原理与实践
大数据
大大大大晴天5 天前
Hudi技术内幕:深入解析Index索引机制
大数据
阿里云大数据AI技术5 天前
Flink Forward Asia 2026 深圳启幕:Agentic Streaming for AI,开启实时智能新范式
大数据·flink
SelectDB5 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
掉头发的王富贵5 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql