详解拉链表



2018年11月01日    Author:Guofei

文章归类: 0x11_算法平台    文章编号: 195

版权声明:本文作者是郭飞。转载随意,但需要标明原文链接,并通知本人
原文链接:https://www.guofei.site/2018/11/01/data.html


介绍

  1. 全量表:每天的所有的最新状态的数据,
  2. 增量表:每天的新增数据,增量数据是上次导出之后的新数据。
  3. 拉链表:维护历史状态,以及最新状态数据的一种表,拉链表根据拉链粒度的不同,实际上相当于快照,只不过做了优化,去除了一部分不变的记录而已,通过拉链表可以很方便的还原出拉链时点的客户记录。
  4. 流水表: 对于表的每一个修改都会记录,可以用于反映实际记录的变更。

拉链表通常是对账户信息的历史变动进行处理保留的结果,流水表是每天的交易形成的历史; 流水表用于统计业务相关情况,拉链表用于统计账户及客户的情况 数据仓库之拉链表(原理、设计以及在Hive中的实现)

拉链表适用于以下情况

  1. 每天一小部分数据有变化,用全量表会浪费大量的存储空间
  2. 希望能较为方便的查询历史快照(流水表和增量表不满足需求)

这里介绍一种 HIVE 常见的拉链表构建方案

结构

会有这些字段:

ds, dt, end_date, start_date

其中,以这些字段进行分区:

ds, dt, end_date

分区示例(今天是2018年11月1日)

ds=ACTIVE/dt=8012-12-31/end_date=8012-12-31
ds=EXPIRED/dt=2018-10-29/end_date=2018-10-29
ds=EXPIRED/dt=2018-10-30/end_date=2018-10-30
ds=EXPIRED/dt=2018-10-31/end_date=2018-10-31
ds=HISTORY/dt=8012-12-31/end_date=8012-12-31
ds=INCREMENT/dt=0-2018-10-29/end_date=0-2018-10-29
ds=INCREMENT/dt=0-2018-10-30/end_date=0-2018-10-30
ds=INCREMENT/dt=0-2018-10-31/end_date=0-2018-10-31
ds=INCREMENT/dt=0-2018-11-01/end_date=0-2018-11-01

其中

  1. HISTORY 分区存放的是历史数据转结,非必须。
  2. INCREMENT 为实时导入的数据,非必须
  3. ds非必须,但为了查询语句易读,往往加上这个字段
  4. dt非必须,一般也不用到查询语句中,但这个dt可以用来表示产生此分区的日期,增强可读性

查询

查询昨日线上数据

ds='ACTIVE'

查询某一天的数据(快照)

end_data>'2018-11-11' and start_date<='2018-11-11'

构建

1号的数据
2018-01-01
keycol1col2
1AA
2BB
3CC
2号的数据
2018-01-02
keycol1col2
1AAA
2BB
3CC
4DD
做成拉链表:
keycol1col2start_dateend_datedsdt
1AA2018-01-012018-01-02EXPIRED2018-01-02
1AAA2018-01-028012-12-31ACTIVE8012-12-31
2BB2018-01-018012-12-31ACTIVE8012-12-31
3CC2018-01-018012-12-31ACTIVE8012-12-31
4DD2018-01-028012-12-31ACTIVE8012-12-31

参考资料

http://lxw1234.com/archives/2015/04/20.htm
https://www.jianshu.com/p/799252156379


您的支持将鼓励我继续创作!