拉链表

1 定义

使用生效时间和失效时间两个字段来标记数据的历史状态,从而在节省存储空间的效果下保留数据的历史状态。

2 优缺点

(1) 优点

  • 保留数据的历史信息
  • 节省存储空间

(2) 缺点

  • 同步和回滚逻辑复杂

3 使用方法

(1) 两个表

全量表和增量表

  • 全量表记录数据的历史状态
  • 增量表记录数据的增量信息

(2) 更新流程

  • 关联全量表和增量表,修改增量表中出现的数据行的失效时间
  • 合并增量表和修改后的全量表

4 示例

(1) 表定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 历史表
CREATE EXTERNAL TABLE ods.user (
user_num STRING COMMENT '用户编号',
mobile STRING COMMENT '手机号码',
reg_date STRING COMMENT '注册日期'
COMMENT '用户资料表'
PARTITIONED BY (dt string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
STORED AS ORC
LOCATION '/ods/user';
)

# 增量表
CREATE EXTERNAL TABLE ods.user_update (
user_num STRING COMMENT '用户编号',
mobile STRING COMMENT '手机号码',
reg_date STRING COMMENT '注册日期'
COMMENT '每日用户资料更新表'
PARTITIONED BY (dt string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
STORED AS ORC
LOCATION '/ods/user_update';
)

# 拉链表
CREATE EXTERNAL TABLE dws.user_his (
user_num STRING COMMENT '用户编号',
mobile STRING COMMENT '手机号码',
reg_date STRING COMMENT '用户编号',
t_start_date ,
t_end_date
COMMENT '用户资料拉链表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
STORED AS ORC
LOCATION '/dws/user_his';
)

(2) 数据更新

更新增量表包含的历史表数据,并增量表合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
INSERT OVERWRITE TABLE dws.user_his
SELECT * FROM
(
SELECT A.user_num,
A.mobile,
A.reg_date,
A.t_start_time,
CASE
WHEN A.t_end_time = '9999-12-31' AND B.user_num IS NOT NULL THEN '2017-01-01'
ELSE A.t_end_time
END AS t_end_time
FROM dws.user_his AS A
LEFT JOIN ods.user_update AS B
ON A.user_num = B.user_num
UNION
SELECT C.user_num,
C.mobile,
C.reg_date,
'2017-01-02' AS t_start_time,
'9999-12-31' AS t_end_time
FROM ods.user_update AS C
) AS T

(3) 数据查询

通过查询生效和失效日期获取所需数据

(4) 数据删除

由于binlog中记录了数据行的转变过程,可以通过回滚达到删除的目的。

详见拉链表(二)

5 优化

(1) 索引

因为查询依赖于生效和失效时间,可以对这两个字段添加索引。如在Hive中,使用ORC存储时,可以先Bloom Filter Index和Row Group Index,再拉链表排序后插入。

(2) 数据量

时间拆分:拆分历史数据拉链表和当前阶段拉链表,提高查询效率。

修改次数拆分:设定修改次数阈值,超过则移动到另一拉链表中。

参考资料

拉链表(一)

拉链表(二)

拉链表及其Hive实现

数据仓库之拉链表