Hive表类型及使用技巧-拉链表
拉链表
一、数据加工和维护
- 概念:
所谓拉链表就是记录一个事物从开始 一直到当前状态的所有变化信息;通过比较,记录数据的生命周期,能够快速还原任意天的历史快照,而非全量的每天记录所有数据,因此极大节省了存储。
一般表名后面xxx_chain - 数据加工方式:
(1)拉链表中一般会存在一个字段“start_date”表示该记录的起始时间,不代表创建时间,非业务时间。一把会存在"createtime"表示该条记录的创建时间。
(2)分区:一般dp分区包含线上(‘ACTIVE’)、过期(‘EXPIRED’)其中ACTIVE表示当前线上状态。还会有end_date分区记录数据有效期的截止日期。dt分区表示记录加工的时间分区,因此end_date和dt一般相同。
(3)有些情况,dp中还存在HISTORY分区,和生产系统对应。
(4)dp='ACTIVE’每日都会保持与线上数据一致,其有效截止日期end_date一般会设置成一个较大的值,比如’4712-12-31’ 。 - 举例:
id=1记录发生了变化,而id=4是新增的记录。
EXPIRED分区只关注发生变化的记录,ACTIVE是最新的线上数据。
二、查询规则
- 某一天历史快照,该天线上数据(历史上该天时的ACTIVE)
select * from xxx_chain where start_date<=MY_DATE and end_date>MY_DATE
- 某天新生成的数据
select * from xxx_chain where start_date>=MY_DATE and substr(createtime,1,10)=MY_DATE
为了减少数据量,可以限制分区end_date>=MY_DATE
- 某段时间新生成的数据
select * from xxx_chain where start_date>=MY_DATE1 and substr(createtime,1,10)>=MY_DATE1 and substr(createtime,1,10)<=MY_DATE2
为了减少数据量,可以限制分区end_date>=MY_DATE1
- 线上最新数据
(1)与历史快照相同,当前的历史快照就是当前最新数据
select from xxx_chain where start_date<=MY_DATE and end_date>MY_DATE
(2)根据ACTIVE
select from xxx_chain where dp='ACTIVE'
(3)存在结转HISTORY分区
select from xxx_chain
where dp in ( 'ACTIVE','HISTORY')