创建Tag和Branch
本章节介绍如何创建Iceberg Tag和Branch。Tag可用于保留重要的历史快照以用于审计溯源。Branch作为可变的快照引用,可用于数据开发测试隔离、数据快速回滚修复等场景,满足数据迭代与故障恢复的需求。
如果创建Tag和Branch时没有指定RETAIN策略,Tag和Branch默认会永久保存不会自动过期。在SQL语句中,可通过RETAIN <int> {DAYS | HOURS | MINUTES}语法自定义保留策略。
创建Tag
创建Tag的操作如下
- 每周保留1个快照,持续1个月。
- 获取current-snapshot-id:
DESCRIBE EXTENDED prod.db.table;
其中,创建“local.db.table”详细操作请参见从零开始使用Iceberg。
例如,获取到的current-snapshot-id为“2767263131158701491”。
- 可以通过每周标记快照并将Tag保留期设置为一个月来实现。快照将被保留,且分支引用本身将保留1周。
ALTER TABLE prod.db.table CREATE TAG EOM_01 AS OF VERSION {current-snapshot-id} RETAIN 7 DAYS;例如,{current-snapshot-id}为“2767263131158701491”,则执行以下命令:
ALTER TABLE prod.db.table CREATE TAG EOM_01 AS OF VERSION 2767263131158701491 RETAIN 7 DAYS;
- 获取current-snapshot-id:
- 每月保留1个快照,持续6个月。
- 每年保留1个快照,永久保存。
创建Branch
创建Branch的流程如下:
- 首先设置“write.wap.enabled”为“true”以开启写前预提交功能:
ALTER TABLE prod.db.table SET TBLPROPERTIES ( 'write.wap.enabled'='true');
- 基于主表创建分支。
- 切换分支并执行写入操作。
通过切换audit_branch分支去验证表功能或者数据质量等,不影响表的主分支。
切换分支:
SET spark.wap.branch = audit_branch;
写入数据:
INSERT INTO prod.db.table VALUES (5, 'e');
查看表数据:
select * from prod.db.table;
查看的表数据中包含新写入的数据。
- 验证通过后,可将主分支推进至audit_branch分支的最新状态,以更新主表状态:
CALL prod.system.fast_forward('db.table', 'main', 'audit_branch'); - 1周后执行expireSnapshots操作,该过期分支将被删除。
注意:主表执行schema evolution对所有分支都生效。操作如下所示:
- 创建表并插入数据。
- 创建表:
CREATE TABLE prod.db.table (id bigint, data string, col float);
- 向表中插入数据:
INSERT INTO prod.db.table VALUES (1, 'a', 1.0), (2, 'b', 2.0), (3, 'c', 3.0);
- 查询表数据:
SELECT * FROM prod.db.table;
例如,查询结果为:
-- 1 a 1.0 -- 2 b 2.0 -- 3 c 3.0
- 创建表:
- 创建分支指向当前快照:
ALTER TABLE prod.db.table CREATE BRANCH test_branch;
查询分支数据:
SELECT * FROM prod.db.table VERSION AS OF 'test_branch';
例如,查询结果为:
-- 1 a 1.0 -- 2 b 2.0 -- 3 c 3.0
- 修改Schema,删除“col”列并添加一个名为“new_col”的新列。
- 删除“col”列:
ALTER TABLE prod.db.table DROP COLUMN col;
- 添加一个名为“new_col”的新列:
ALTER TABLE prod.db.table ADD COLUMN new_col date;
- 向表中插入数据:
INSERT INTO prod.db.table VALUES (4, 'd', date('2024-04-04')), (5, 'e', date('2024-05-05')); - 查询表数据:
SELECT * FROM prod.db.table;
例如,查询结果为:
-- 1 a NULL -- 2 b NULL -- 3 c NULL -- 4 d 2024-04-04 -- 5 e 2024-05-05
- 删除“col”列:
- 查询分支快照:
- 方式一:
SELECT * FROM prod.db.table.branch_test_branch;
- 方式二:
SELECT * FROM prod.db.table VERSION AS OF 'test_branch';
例如,查询结果为:-- 1 a NULL -- 2 b NULL -- 3 c NULL
- 方式一:
- 向分支中写入数据,需要使用主表最新的Schema:
INSERT INTO prod.db.table.branch_test_branch VALUES (6, 'e', date('2024-06-06')), (7, 'g', date('2024-07-07'));查询分支数据:
SELECT * FROM prod.db.table VERSION AS OF 'test_branch';
例如,查询结果为:
-- 6 e 2024-06-06 -- 7 g 2024-07-07 -- 1 a NULL -- 2 b NULL -- 3 c NULL