1 定义
使用生效时间和失效时间两个字段来标记数据的历史状态,从而在节省存储空间的效果下保留数据的历史状态。
2 优缺点
(1) 优点
- 保留数据的历史信息
- 节省存储空间
(2) 缺点
- 同步和回滚逻辑复杂
3 使用方法
(1) 两个表
全量表和增量表
- 全量表记录数据的历史状态
- 增量表记录数据的增量信息
(2) 更新流程
- 关联全量表和增量表,修改增量表中出现的数据行的失效时间
- 合并增量表和修改后的全量表
4 示例
(1) 表定义
1 | # 历史表 |
(2) 数据更新
更新增量表包含的历史表数据,并增量表合并
1 | INSERT OVERWRITE TABLE dws.user_his |
(3) 数据查询
通过查询生效和失效日期获取所需数据
(4) 数据删除
由于binlog中记录了数据行的转变过程,可以通过回滚达到删除的目的。
详见拉链表(二)
5 优化
(1) 索引
因为查询依赖于生效和失效时间,可以对这两个字段添加索引。如在Hive中,使用ORC存储时,可以先Bloom Filter Index和Row Group Index,再拉链表排序后插入。
(2) 数据量
时间拆分:拆分历史数据拉链表和当前阶段拉链表,提高查询效率。
修改次数拆分:设定修改次数阈值,超过则移动到另一拉链表中。