前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >0910-Apache Hive 4.x与Iceberg分支和标签

0910-Apache Hive 4.x与Iceberg分支和标签

作者头像
Fayson
发布2023-11-16 13:14:21
3710
发布2023-11-16 13:14:21
举报
文章被收录于专栏:Hadoop实操Hadoop实操

对于复杂的快照生命周期管理,Iceberg支持分支(branch)和标签(tag),这些分支和标签是对具有自己独立生命周期的快照的命名引用,此生命周期由分支和标签级别保留策略控制。分支是快照的独立谱系(lineage),指向谱系的头部。

初始设置

1.创建版本为4.0.0-beta-2-SNAPSHOT 的 docker 环境,参考以下链接可以了解创建docker环境的步骤,将版本指定为 4.0.0-beta-2-SNAPSHOT。

代码语言:javascript
复制
https://iceberg.apache.org/hive-quickstart/

2.创建一张iceberg表

代码语言:javascript
复制
CREATE TABLE test (ID INT) STORED BY ICEBERG TBLPROPERTIES('format-version'='2');

3.插入一些数据生成多个快照:

代码语言:javascript
复制
INSERT INTO test VALUES (1), (2);
INSERT INTO test VALUES (3), (4);
INSERT INTO test VALUES (5), (6);
INSERT INTO test VALUES (6), (7);

4.获取Iceberg table对应的快照列表

代码语言:javascript
复制
SELECT * FROM default.test.history;

上面会列出该表对应的快照,用来创建分支和标签,以下为示例输出:

注意:每个人的快照ID和时间戳都不同。

2 创建分支

可以通过简单的Alter Table…Create Branch…语句从表创建分支,该语句指定表和分支名称以及与应充当分支HEAD的快照相对应的System Version或System Time。 1.使用SYSTEM_VERSION创建:

代码语言:javascript
复制
ALTER TABLE test CREATE BRANCH branch1 FOR SYSTEM_VERSION AS OF 3369973735913135680;

以上从表test创建了一个名为branch1的分支,对应到指定的snapshot id(前文history表里的第二行)。 2.使用SYSTEM_TIME创建:

代码语言:javascript
复制
ALTER TABLE test CREATE BRANCH branch2 FOR SYSTEM_TIME AS OF '2023-09-16 09:46:38.939 Etc/UTC';

以上从表test创建了一个名为branch2分支,该分支与指定时间戳处的表状态相对应(前文history表里的第三行)。 3.使用默认配置创建: 如果没有提供参数来指定快照版本,则可以创建一个指向Iceberg表的当前主分支(表的当前状态)的分支。

代码语言:javascript
复制
ALTER TABLE test CREATE BRANCH branch3;

上面创建了一个名为branch3的分支,它与当前表test处于相同的状态。 4.或者可以在创建分支时指定每个分支的快照保留数量,如下所示:

代码语言:javascript
复制
ALTER TABLE test CREATE BRANCH branch4 FOR SYSTEM_VERSION AS OF 3369973735913135680 with SNAPSHOT RETENTION 5 SNAPSHOTS;

列出创建的分支和标签

可以使用iceberg的refs元数据表列出创建的分支和标签。

代码语言:javascript
复制
select * from default.test.refs;

写入分支

数据可以像普通iceberg表一样被摄取到iceberg表分支中,在查询中需要按以下方式指定分支名称。

代码语言:javascript
复制
<Database Name>.<Table Name>.branch_<Branch Name>

1.插入分支

代码语言:javascript
复制
INSERT INTO TABLE default.test.branch_branch1 VALUES (10, 11);

上面将值插入到“default”数据库中表“test”的“branch1”中 2.更新分支中的值

代码语言:javascript
复制
UPDATE TABLE default.test.branch_branch1 SET ID=20 WHERE ID=10;

上面的查询更新“default”数据库中表“test”的“branch1”中的值。 3.删除分支中的值

代码语言:javascript
复制
DELETE FROM default.test.branch_branch1 WHERE ID=11;

上面的查询删除了“default”数据库中“test”表的“branch1”中的指定值。

除了这些之外,冰山分支还支持所有其他查询,例如 Merge/IOW/Load。

查询分支

Iceberg分支像任何其他Hive表一样支持所有查询语句。

代码语言:javascript
复制
select * from default.test.branch_branch1;

示例输出:

除此之外,Iceberg分支支持所有其他读取查询。

快进分支

作为另一个分支的祖先的Iceberg分支可以快进到另一个分支的状态。如下将一些数据插入主分支。

代码语言:javascript
复制
INSERT INTO test values (55), (66);

现在将之前创建的branch3快进到当前的主分支:

代码语言:javascript
复制
ALTER table test EXECUTE FAST-FORWARD 'branch3' 'main';

这会将branch3快进到main分支状态,现在查询branch3将显示新插入的记录。

如果未指定第二个分支名称,主分支将快进到指定的分支,如下所示从“branch3”中删除一些值。

代码语言:javascript
复制
DELETE FROM default.test.branch_branch3 WHERE ID=66;

上面将表test的主分支快进到branch3的状态。

Cherry-Pick into a Branch

目前Iceberg表只支持在主分支上使用cherry-pick commits,如果我们想回滚到之前的commit,并且只想从未来状态的单个commit中pull in该更改,我们可以cherry-pick该commit。如下获取表的当前历史:

代码语言:javascript
复制
SELECT * FROM default.test.history;

回滚当前表:

代码语言:javascript
复制
ALTER table test EXECUTE ROLLBACK 3369973735913135680;

上面将主表回滚到历史列表中的第二个快照。

Cherry-Pick历史表中的倒数第二个快照,那个时候插入了55和56。

代码语言:javascript
复制
ALTER table test EXECUTE CHERRY-PICK 8602659039622823857;

删除分支

可以按如下删除Iceberg分支:

代码语言:javascript
复制
ALTER TABLE test DROP BRANCH branch1;

上面的查询删除表test的“branch1”,drop branch的语法还支持“IF EXISTS”子句,以防止分支已删除或不存在时出现错误,如下所示:

代码语言:javascript
复制
ALTER TABLE test DROP BRANCH IF EXISTS branch1;

创建标签

可以使用Alter table…Create Tag语句并通过指定表和分支名称以及与标签应引用的快照相对应的System_version或 System_time来从表创建标签。 1.使用SYSTEM_VERSION创建:

代码语言:javascript
复制
ALTER TABLE test CREATE TAG tag1 FOR SYSTEM_VERSION AS OF 3369973735913135680;

以上语句是从与指定快照ID(历史表中的第二个)对应的表test中创建了一个名为tag1的标签。 2.使用SYSTEM_TIME创建:

代码语言:javascript
复制
ALTER TABLE test CREATE TAG tag2 FOR SYSTEM_TIME AS OF '2023-09-16 09:46:38.939 Etc/UTC';

上面的代码从表test中创建了一个名为tag2的标签,该标签与指定时间戳处的表状态相对应(历史表中第三个)。 3.使用默认配置创建: 如果没有提供参数来指定快照版本,则可以创建一个指向Iceberg表的当前主分支(表的当前状态)的标签。

代码语言:javascript
复制
ALTER TABLE test CREATE TAG tag3;

上面创建了一个名为 tag3 的标签,它与当前test表处于相同的状态。

查询标签

Iceberg标签支持各种读取查询,可以通过指定标签名称而不是表名称来执行查询,格式如下。

代码语言:javascript
复制
<Database Name>.<Table Name>.tag_<Tag Name>

例如:

代码语言:javascript
复制
SELECT * FROM default.test.tag_tag1;

删除标签

使用如下语句删除Iceberg标签:

代码语言:javascript
复制
ALTER TABLE test DROP TAG tag1;

上面的查询删除了表test对应的tag1,drop tag语法还支持“IF EXISTS”子句,以防止标签已删除或不存在时出现错误,如:

代码语言:javascript
复制
ALTER TABLE test DROP TAG IF EXISTS tag1;

注意:本文提到的Apache Hive-4.0.0-beta-2版本的一部分功能,预计2023年12月发布。4.0.0-beta-2-SNAPSHOT版本的 docker镜像不是官方Apache Hive版本,仅适用于开发使用。

原文参考:

代码语言:javascript
复制
https://medium.com/@ayushtkn/apache-hive-4-x-with-iceberg-branches-tags-3d52293ac0bf
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-11-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 初始设置
  • 2 创建分支
  • 列出创建的分支和标签
  • 写入分支
  • 查询分支
  • 快进分支
  • Cherry-Pick into a Branch
  • 删除分支
  • 创建标签
  • 查询标签
  • 删除标签
相关产品与服务
标签
标签(Tag)是腾讯云推出的云资源管理工具,您可从不同维度对具有相同特征的云资源进行分类、搜索和聚合,从而轻松管理云上资源。 标签是由标签键和标签值共同组成,您可以为云资源创建和绑定标签
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档