数据仓库:拉链表详解

Posted Tunky的实用主义

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据仓库:拉链表详解相关的知识,希望对你有一定的参考价值。

传统拉链表存取: 


每日应用系统都提供一个快照(例如银行日切快照),如果每日都存储一个快照,则是极大的存储浪费。比较好的方式是利用拉链存储,每次都只存储数据的增量部分,但是又能恢复任意时刻的快照进行统计分析。


第一日快照,生成第一日拉链表:

  • 每条记录都增加start_date和end_date,start_date统一都是第一日,end_date填写9999-12-31

数据仓库(3):拉链表详解

第二日快照与第一日拉链表,生成第二日拉链表:

  • 第一日拉链表通过start_date<=第一日 and end_date>=第一日,生成第一日快照

  • 第二日快照比第一日快照,把新增数据插入到拉链表,start_date为第二日,end_date为9999-12-31

  • 第二日快照比第一日拉链中end_date为9999-12-31的数据,对比字段值找到拉链表中发生变化的数据,把拉链表中变化数据中end_date为9999-12-31的修改为“第二日-1”

  • 第二日快照比第一日拉链中end_date为9999-12-31的数据,把第二日快照中的变化数据,插入到拉链表中,start_date=第二日,end_date=9999-12-31

数据仓库(3):拉链表详解

数据仓库(3):拉链表详解

第三日快照与第二日拉链表,生成第三日拉链表:

  • 第二日拉链表通过start_date<=第二日 and end_date>=第二日生成第二日快照

  • 第三日快照比第二日快照,把新增数据插入到拉链表,start_date为第三日,end_date为9999-12-31

  • 第三日快照比第二日拉链中的end_date为9999-12-31的数据,对比字段值找到拉链表中发生变化的数据,把拉链表中变化数据中end_date为9999-12-31的修改为“第三日-1”

  • 第三日快照比第二日拉链中的end_date为9999-12-31的数据,对比字段值找到拉链表中发生变化的数据,把第三日快照中的变化数据插入到拉链表中,start_date=第三日,end_date=9999-12-31

数据仓库(3):拉链表详解

数据仓库(3):拉链表详解

拉链表数据获取的方式为:

  • select * from 拉链表 where end_date>=当日, 取最新有效记录

  • select * from 拉链表 where start_date<=当日 and end_date>=当日, 生成当日的快照



大数据数据仓库拉链表存取:


大数据数据仓库不支持数据修改,因此对于大数据的数仓拉链表来说,生成的逻辑就变成了,利用当日的快照和昨日的拉链表,生成今日的拉链表。


拉链表数据由5部分构成:

1.当日的快照和昨日的拉链表相比,主键新增的数据行

2.当日快照和拉链表最新记录(end_date>=当日)相比,拉链表中有内容更新的数据行

3.当日快照和拉链表最新记录(end_date>=当日)相比,当日快照中有内容更新的数据行

4.拉链表最新记录(end_date>=当日)中,无数据更新的数据行

5.拉链表中历史记录(end_date<当日)的记录



当日的快照和昨日的拉链表进行5次join,然后把各子集的结果union all成一个新的结果集,就是当日拉链表。



用不同的颜色标识不同的拉链数据部分:

数据仓库(3):拉链表详解

数据仓库(3):拉链表详解


第一日快照,生成第一日拉链表:


数据仓库(3):拉链表详解


第二日快照,与第一日拉链表生成第二日拉链表

数据仓库(3):拉链表详解

数据仓库(3):拉链表详解

第三日快照,与第二日拉链表生成第三日拉链表


以上是关于数据仓库:拉链表详解的主要内容,如果未能解决你的问题,请参考以下文章

Hive拉链表实战-SQL模拟hive仓库拉链表实现

数据仓库的数据模型(拉链表-能追踪历史信息的实现方案)实践杂谈

MYSQL模拟hive仓库拉链表实现

MYSQL模拟hive仓库拉链表实现

MYSQL模拟hive仓库拉链表实现

每日一学数据仓库之全量表增量表拉链表流水表