拉链表

拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史。记录一个事物从开始,一直到当前状态的所有变化的信息。

优点:为了节省数据库的空间

用处:记录一个事物从开始到现在所有的状态信息。

1采集原系统的全量数据到表new1.

2从历史表中获取昨日全量数据到表new2.

3从new1和new2中比较出新增和改变的数据,也就是增量数据到表new3.

4从new1和new2中比较出来改变的数据,到表new4.

5将new3的数据插入到历史表中,这些是新增记录,startdate为当天,enddate为max的值。

6对历史表中new4的数据进行更新操作,startdate保持不变,enddate改为当天。也就是关链操作。

下面为具体例子:

OD(在第一天就等于HIS)
用户标志    状态开始时间结束时间
1             1   200712    299901
2             2    200712   299901
3             3    200712   299901
4             4    200712   299901
5             5    200712   299901

ND
用户标志   状态开始时间结束时间
1             2   200801      299901
2             2    200801      299901
3             4    200801      299901
4             4    200801      299901
5             6    200801      299901

W_I=ND-OD
用户标志    状态开始时间结束时间
1             2  200801         299901
3             4   200801        299901
5             6   200801         299901

W_U=OD-ND
用户标志   状态开始时间结束时间
1            1  200712            299901
3            3   200712          299901
5            5   200712          299901

INSERT操作把I插入到HIS
用户标志   状态开始时间结束时间
1            1  200712          299901
2            2   200712           299901
3            3   200712           299901
4            4   200712           299901
5            5   200712           299901
1            2   200801          299901
3            4   200801          299901
5                     6  200801         299901

update操作按U更新HIS
用户标志    状态开始时间结束时间
1               1  200712   200801
2               2   200712  299901
3               3   200712  200801
4               4   200712   299901
5               5   200712  200801
1               2   200801  299901
3               4   200801  299901
5               6   200801  299901

-----------------------------------------------------------------------------------------------------------------------------------------

(一)概念
      拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史。记录一个事物从开始,一直到当前状态的所有变化的信息。

在历史表中对客户的一生的记录可能就这样几条记录,避免了按每一天记录客户状态造成的海量存储的问题:
(NAME)人名 (START-DATE)开始日期 (END-DT)结束日期 (STAT)状态
     client              19000101                         19070901                H在家
     client              19070901                         19130901                A小学
     client              19130901                         19160901                B初中
     client              19160901                         19190901                C高中
     client              19190901                         19230901                D大学
     client              19230901                         19601231                E公司
     client              19601231                         29991231             H退休在家

上面的每一条记录都是不算末尾的,比如到19070901,client已经在A,而不是H了。所以除最后一条记录因为状态到目前都未改变的,其余的记录实际上在END-DT那天,都不在是该条记录END-DT那天的状态。这种现象可以理解为算头不算尾。

(二)算法
     1、采集当日全量数据到ND(NewDay)表;
     2、可从历史表中取出昨日全量数据存储到OD(OldDay)表;
     3、(ND-OD)就是当日新增和变化的数据,也就是当天的增量,用W_I表示;
     4、(OD-ND)为状态到此结束需要封链的数据,用W_U表示;

5、将W_I表的内容全部插入到历史表中,这些是新增记录,start_date为当天,而end_date为max值;
     6、对历史表进行W_U部份的更新操作,start_date保持不变,而end_date改为当天,也就是关链操作;

(三)一个实际例子(teradata)
     1、定义两个临时表,一个为当日全量数据,另一个为需要新增或更新的数据;
     CREATE VOLATILE TABLE VT_xxxx_NEW AS xxxx WITH NO DATA ON COMMIT PRESERVE ROWS;
     CREATE VOLATILE SET TABLE VT_xxxx_CHG,NO LOG AS xxxx WITH NO DATA ON COMMIT PRESERVE ROWS;

2、获取当日全量数据
     INSERT INTO VT_xxxx_NEW(xx) SELECT (xx,cur_date, max_date) FROM xxxx_sorce; ND

3、抽取新增或有变化的数据,从xxxx_NEW临时表到xxxx_CHG临时表;
     INSERT INTO VT_xxxx_CHG(xx)
     SELECT xx FROM VT_xxxx_NEW
     WHERE (xx) NOT IN (select xx from xxxx_HIS where end_date=‘max_date‘);

4、更新历史表的失效记录的end_date为max值
     UPDATE A1 FROM xxxx_HIS A1, VT_xxxx_CHG A2
     SET End_Date=‘current_date‘
     WHERE A1.xx=A2.xx AND A1.End_Date=‘max_date‘;
     5、将新增或者有变化的数据插入目标表*/
     INSERT INTO xxxx_HIS SELECT * FROM VT_xxxx_CHG;

拉链表

时间: 2024-10-17 21:14:38

拉链表的相关文章

hive 中的拉链表 1

hive中拉链表 在有些情况下,为了保持历史的一些状态,需要用拉链表来做,这样做目的在可以保留所有状态的情况下可以节省空间. 拉链表适用于以下几种情况吧 数据量有点大,表中某些字段有变化,但是呢变化的频率也不是很高,业务需求呢又需要统计这种变化状态,每天全量一份呢,有点不太现实, 不仅浪费了存储空间,有时可能业务统计也有点麻烦,这时,拉链表的作用就提现出来了,既节省空间,又满足了需求. 一般在数仓中通过增加begin_date,en_date来表示,如下例,后两列是start_date和end_

使用kettle制作拉链表

拉链表是在数据仓库中常见的表,主要用还存储不按时间变化的表,比如客户基本信息表. 下面先建两个实例表,user_info和user_info_l,其中user_info_l为拉链表. user_info表及数据: user_info_l表及转换后的数据: kettle的设计其实很简单,就一个“表输入”一个“维度查询/更新 下面来看一下表输入的配置: 这个很简单,但是一定要有个基本表的数据日期 下面几个是“维度查询/更新”的配置: 下面介绍一下设置中的关键地方,依次如下: 1.不钩选的话变化的数据

极限存储--历史拉链表(上)

在数据仓库的数据模型设计过程中,经常会遇到这样的需求: 1. 数据量比较大;2. 表中的部分字段会被update,如用户的地址,产品的描述信息,订单的状态等等;3. 需要查看某一个时间点或者时间段的历史快照信息,比如,查看某一个订单在历史某一个时间点的状态,   比如,查看某一个用户在过去某一段时间内,更新过几次等等;4. 变化的比例和频率不是很大,比如,总共有1000万的会员,每天新增和发生变化的有10万左右;5. 如果对这边表每天都保留一份全量,那么每次全量中会保存很多不变的信息,对存储是极

基于hive的拉链表设计实现

参考http://lxw1234.com/archives/2015/08/473.htm 测试数据 order_2015-08-21 1 2015-08-18 2015-08-18 创建2 2015-08-18 2015-08-18 创建3 2015-08-19 2015-08-21 支付4 2015-08-19 2015-08-21 完成5 2015-08-19 2015-08-20 支付6 2015-08-20 2015-08-20 创建7 2015-08-20 2015-08-21 支付

拉链表流水表

1. 全量表:每天的所有的最新状态的数据, 2. 增量表:每天的新增数据,增量数据是上次导出之后的新数据. 3. 拉链表:维护历史状态,以及最新状态数据的一种表,拉链表根据拉链粒度的不同,实际上相当于快照,只不过做了优化,去除了一部分不变的记录而已,通过拉链表可以很方便的还原出拉链时点的客户记录. 4. 流水表: 对于表的每一个修改都会记录,可以用于反映实际记录的变更. 拉链表通常是对账户信息的历史变动进行处理保留的结果,流水表是每天的交易形成的历史: 流水表用于统计业务相关情况,拉链表用于统计

数仓1.4 |业务数仓搭建| 拉链表| Presto

电商业务及数据结构 SKU库存量,剩余多少SPU商品聚集的最小单位,,,这类商品的抽象,提取公共的内容 订单表:周期性状态变化(order_info) id 订单编号 total_amount 订单金额 order_status 订单状态 user_id 用户id payment_way 支付方式 out_trade_no 支付流水号 create_time 创建时间 operate_time 操作时间 订单详情表:(order_detail) order_detail.order_id 是要一

Hive拉链表实现

拉链表测试: 有如下测试数据 --2019/12/1号订单的全量数据 id status create_time operation_time 1 待支付 2019-12-01 2 待支付 2019-12-01 3 已支付 2019-12-01 --2019/12/2号订单的全量数据 id status create_time operation_time 1 待支付 2019-12-01 2 已支付 2019-12-01 2019-12-02 3 已支付 2019-12-01 4 待支付 20

hive 拉链表

-- This example demonstrates Type 2 Slowly Changing Dimensions in Hive.-- Be sure to stage data in before starting (load_data.sh)drop database if exists type2_test cascade;create database type2_test;use type2_test; -- Create the Hive managed table fo

Hive数据模型之历史拉链表

http://lxw1234.com/archives/2015/04/20.htm http://lxw1234.com/archives/2015/08/473.htm 原文地址:https://www.cnblogs.com/zbw1112/p/12100920.html