介绍
- 全量表:每天的所有的最新状态的数据,
- 增量表:每天的新增数据,增量数据是上次导出之后的新数据。
- 拉链表:维护历史状态,以及最新状态数据的一种表,拉链表根据拉链粒度的不同,实际上相当于快照,只不过做了优化,去除了一部分不变的记录而已,通过拉链表可以很方便的还原出拉链时点的客户记录。
- 流水表: 对于表的每一个修改都会记录,可以用于反映实际记录的变更。
拉链表通常是对账户信息的历史变动进行处理保留的结果,流水表是每天的交易形成的历史; 流水表用于统计业务相关情况,拉链表用于统计账户及客户的情况 数据仓库之拉链表(原理、设计以及在Hive中的实现)
拉链表适用于以下情况
- 每天一小部分数据有变化,用全量表会浪费大量的存储空间
- 希望能较为方便的查询历史快照(流水表和增量表不满足需求)
这里介绍一种 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
其中
- HISTORY 分区存放的是历史数据转结,非必须。
- INCREMENT 为实时导入的数据,非必须
- ds非必须,但为了查询语句易读,往往加上这个字段
- dt非必须,一般也不用到查询语句中,但这个dt可以用来表示产生此分区的日期,增强可读性
查询
查询昨日线上数据
ds='ACTIVE'
查询某一天的数据(快照)
end_data>'2018-11-11' and start_date<='2018-11-11'
构建
1号的数据
2018-01-01 | ||
---|---|---|
key | col1 | col2 |
1 | A | A |
2 | B | B |
3 | C | C |
2号的数据
2018-01-02 | ||
---|---|---|
key | col1 | col2 |
1 | A | AA |
2 | B | B |
3 | C | C |
4 | D | D |
做成拉链表:
key | col1 | col2 | start_date | end_date | ds | dt |
---|---|---|---|---|---|---|
1 | A | A | 2018-01-01 | 2018-01-02 | EXPIRED | 2018-01-02 |
1 | A | AA | 2018-01-02 | 8012-12-31 | ACTIVE | 8012-12-31 |
2 | B | B | 2018-01-01 | 8012-12-31 | ACTIVE | 8012-12-31 |
3 | C | C | 2018-01-01 | 8012-12-31 | ACTIVE | 8012-12-31 |
4 | D | D | 2018-01-02 | 8012-12-31 | ACTIVE | 8012-12-31 |
参考资料
http://lxw1234.com/archives/2015/04/20.htm
https://www.jianshu.com/p/799252156379