HiveCatalog
Hive
Iceberg 通过 StorageHandler 支持借助 Hive 读写 Iceberg 表。
功能支持
Hive 4.0.0 及以上版本支持以下功能:
- 创建 Iceberg 表。
- 创建 Iceberg 身份分区表。
- 创建具有任意分区规范的 Iceberg 表,包括 Iceberg 支持的各种转换。
- 基于已有表创建表(CTAS 表)。
- 删除表。
- 修改表并保持 Iceberg 与 Hive 的 Schema 同步。
- 修改分区 Schema(更新列)。
- 通过指定分区转换修改分区 Schema。
- 截断表/分区,删除分区。
- 将 Avro、Parquet 或 ORC(非 ACID)格式的表迁移到 Iceberg。
- 读取 Iceberg 表。
- 读取表的 Schema。
- 查询 Iceberg 元数据表。
- 时间旅行应用。
- 向表/分区插入数据(INSERT INTO)。
- 向表/分区插入数据并覆盖已有数据(INSERT OVERWRITE)。
- 针对删除、更新和合并查询的写时复制支持,以及对 Iceberg V1 表的 CRUD 支持。
- 修改表以过期快照。
- 基于已有表创建表(CTLT 表)。
- 支持通过表属性添加 Parquet 压缩类型(压缩类型)。
- 修改表元数据位置。
- 支持表回滚。
- 写入表时遵循已有表上的排序规则(排序规则规范)。
- 创建、写入和删除 Iceberg 分支/标签。
- 支持按快照 ID、按时间范围、按保留最近 N 个快照以及使用表属性来过期快照。
- 为 Iceberg 表使用快照 ID 设置当前快照。
- 支持重命名 Iceberg 表。
- 修改表将其转换为 Iceberg 表。
- 将提交快进、拣选到 Iceberg 分支。
- 基于 Iceberg 标签创建分支。
- 为 Iceberg 表使用分支/标签设置当前快照。
- 删除 Iceberg 表的孤儿文件。
- 允许对 Iceberg 表进行全表压缩。
- 支持显示 Iceberg 表的分区信息(SHOW PARTITIONS)。
警告
DML 操作仅能在 Tez 执行引擎下工作。
在 Hive 中启用 Iceberg 支持
从 1.8.0 起,Iceberg 不再发布 Hive 运行时连接器。要进行 Hive 查询引擎集成(特别是针对 Hive 2.x 和 3.x),请使用 Iceberg 1.6.1 附带的 Hive 运行时连接器,或使用内置 Iceberg 集成的 Hive 4.0.0 及更高版本。
Hive 4.1.x、4.2.x
Hive 4.1.x 和 4.2.x 内置了 Iceberg 1.9.1。
Hive 4.0.x
Hive 4.0.x 内置了 Iceberg 1.4.3。
启用支持
如果 Hive 的 classpath 中没有 Iceberg 存储处理器,那么在设置了存储处理器的情况下,Hive 无法加载或更新 Iceberg 表的元数据。为了避免在 Hive 中出现"损坏"的表,除非启用了 Hive 支持,否则 Iceberg 不会为表添加存储处理器。每当该表的 Hive 引擎支持被更新(即在表属性中开启或关闭)时,存储处理器都会随之同步更新(添加或移除)。有两种方式可以启用 Hive 支持:在 Hadoop 配置中全局启用,或通过表属性按表启用。
Hadoop 配置
要为某个应用全局启用 Hive 支持,可在该应用的 Hadoop 配置中设置 iceberg.engine.hive.enabled=true。例如,在 Spark 加载的 hive-site.xml 中进行此设置,将为 Spark 创建的所有表启用存储处理器。
表属性配置
另一种方式是在创建 Iceberg 表时,将属性 engine.hive.enabled 设置为 true 并添加到表属性中。以下是通过编程方式完成此操作的示例:
Catalog catalog=...;
Map<String, String> tableProperties=Maps.newHashMap();
tableProperties.put(TableProperties.ENGINE_HIVE_ENABLED,"true"); // engine.hive.enabled=true
catalog.createTable(tableId,schema,spec,tableProperties);表级配置会覆盖全局 Hadoop 配置。
目录管理
全局 Hive 目录
HiveCatalog 集成支持 Hive 2.3.10、3.1.3 或更高版本。
从 Hive 引擎的角度来看,运行环境的 Hadoop 配置中只定义了一个全局数据目录。相比之下,Iceberg 支持多种不同的数据目录类型,例如 Hive、Hadoop、AWS Glue 或自定义目录实现。Iceberg 还允许直接根据文件系统中的路径加载表,这类表不属于任何目录。用户可能希望通过 Hive 引擎读取这些跨目录、基于路径的表,用于 join 等场景。
为此,Hive 元存储中的表可以通过 iceberg.catalog 属性来表示加载 Iceberg 表的三种不同方式:
- 如果未设置
iceberg.catalog,则使用与 Hive 环境中所配置元存储相对应的HiveCatalog加载该表 - 如果
iceberg.catalog设置为某个目录名称,则使用自定义目录加载该表(见下文) - 如果
iceberg.catalog设置为location_based_table,则可直接使用表的根位置加载该表
对于上述第 2 种和第 3 种情况,用户可以在 Hive 元存储中创建 Iceberg 表的覆盖层,从而使不同类型的表能够在同一 Hive 环境中协同工作。详情请参阅 CREATE EXTERNAL TABLE 和 CREATE TABLE。
自定义 Iceberg 目录
要全局注册不同的目录,请设置以下 Hadoop 配置:
| 配置键 | 说明 |
|---|---|
| iceberg.catalog.<catalog_name>.type | 目录类型:hive、hadoop,若使用自定义目录则可不设置 |
| iceberg.catalog.<catalog_name>.catalog-impl | 目录实现类,当 type 为空时必须设置 |
| iceberg.catalog.<catalog_name>.<key> | 该目录的任意配置键值对 |
以下是使用 Hive CLI 的几个示例:
注册一个名为 another_hive 的 HiveCatalog:
SET iceberg.catalog.another_hive.type=hive;
SET iceberg.catalog.another_hive.uri=thrift://example.com:9083;
SET iceberg.catalog.another_hive.clients=10;
SET iceberg.catalog.another_hive.warehouse=hdfs://example.com:8020/warehouse;注册一个名为 hadoop 的 HadoopCatalog:
SET iceberg.catalog.hadoop.type=hadoop;
SET iceberg.catalog.hadoop.warehouse=hdfs://example.com:8020/warehouse;注册一个名为 glue 的 AWS GlueCatalog:
SET iceberg.catalog.glue.type=glue;
SET iceberg.catalog.glue.warehouse=s3://my-bucket/my/key/prefix;
SET iceberg.catalog.glue.lock.table=myGlueLockTable;DDL 命令
CREATE TABLE
非分区表
当按如下方式指定存储处理器(storage handler)时,Hive 的 CREATE EXTERNAL TABLE 命令会创建一个 Iceberg 表:
CREATE EXTERNAL TABLE x (i int) STORED BY ICEBERG;如果你想通过 CREATE TABLE 创建外部表,请在集群上配置 MetaStoreMetadataTransformer,这样 CREATE TABLE 命令会被转换为创建外部表。例如:
CREATE TABLE x (i int) STORED BY ICEBERG;你可以在创建表时指定默认的文件格式(Avro、Parquet 或 ORC),默认格式为 Parquet:
CREATE TABLE x (i int) STORED BY ICEBERG STORED AS ORC;分区表
你可以使用创建非 Iceberg 表时所熟悉的命令来创建 Iceberg 分区表:
CREATE TABLE x (i int) PARTITIONED BY (j int) STORED BY ICEBERG;信息
生成的表不会在 HMS 中创建分区,而是将分区数据转换为 Iceberg identity 分区。
使用 DESCRIBE 命令获取有关 Iceberg identity 分区的信息:
DESCRIBE x;结果如下:
| col_name | data_type | comment |
|---|---|---|
| i | int | |
| j | int | |
| NULL | NULL | |
| # Partition Transform Information | NULL | NULL |
| # col_name | transform_type | NULL |
| j | IDENTITY | NULL |
你可以使用以下 Iceberg 分区规范语法创建 Iceberg 分区(仅从 Hive 4.0.0 开始支持):
CREATE TABLE x (i int, ts timestamp) PARTITIONED BY SPEC (month(ts), bucket(2, i)) STORED BY ICEBERG;
DESCRIBE x;结果为:
| col_name | data_type | comment |
|---|---|---|
| i | int | |
| ts | timestamp | |
| NULL | NULL | |
| # 分区转换信息 | NULL | NULL |
| # col_name | transform_type | NULL |
| ts | MONTH | NULL |
| i | BUCKET[2] | NULL |
Hive 支持的转换与 Spark 相同:
years(ts):按年分区
months(ts):按月分区
days(ts) 或 date(ts):等同于 dateint 分区
hours(ts) 或 date_hour(ts):等同于 dateint 和小时分区
bucket(N, col):按哈希值对 N 取模进行分桶分区
truncate(L, col):按截断到长度 L 的值进行分区
- 字符串截断到指定长度
- 整数和长整数截断到对应的区间:truncate(10, i) 会生成 0、10、20、30 等分区
信息
生成的表不会在 HMS 中创建分区,而是将分区数据转换为 Iceberg 分区。
CREATE TABLE AS SELECT
CREATE TABLE AS SELECT 操作与 Hive 原生操作类似,只有一处重要区别:Iceberg 表及其对应的 Hive 表会在查询执行开始时创建,数据则在查询完成时插入并提交。因此在短暂的时间窗口内,表已经存在但不包含任何数据。
CREATE TABLE target PARTITIONED BY SPEC (year(year_field), identity_field) STORED BY ICEBERG AS
SELECT * FROM source;CREATE TABLE LIKE TABLE(仿照已有表创建新表)
CREATE TABLE target LIKE source STORED BY ICEBERG;使用 CREATE EXTERNAL TABLE 覆盖已有的 Iceberg 表
CREATE EXTERNAL TABLE 命令用于在已有 Iceberg 表"之上"叠加一个 Hive 表。Iceberg 表可以通过 Catalog 或 Tables 接口的实现来创建,Hive 需要进行相应配置,才能操作这些不同类型的表。
Hive catalog 表
如前所述,由 HiveCatalog 创建且启用了 Hive 引擎特性的表可被 Hive 引擎直接读取,因此无需创建覆盖层。
自定义 catalog 表
对于注册在某个 catalog 中的表,请在语句中通过表属性 iceberg.catalog 指定 catalog 名称。例如,以下 SQL 会为名为 hadoop_cat、类型为 hadoop 的 catalog 中的表创建一个覆盖层:
SET
iceberg.catalog.hadoop_cat.type=hadoop;
SET
iceberg.catalog.hadoop_cat.warehouse=hdfs://example.com:8020/hadoop_cat;
CREATE
EXTERNAL TABLE database_a.table_a
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
TBLPROPERTIES ('iceberg.catalog'='hadoop_cat');当表属性和全局 Hadoop 配置中都没有 iceberg.catalog 时,将默认使用 HiveCatalog。
基于路径的 Hadoop 表
使用 HadoopTables 创建的 Iceberg 表完全存储在 HDFS 等文件系统的某个目录中。这类表被视为没有目录(catalog)。为此,需要将 iceberg.catalog 属性设置为 location_based_table。例如:
CREATE
EXTERNAL TABLE table_a
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
LOCATION 'hdfs://some_bucket/some_path/table_a'
TBLPROPERTIES ('iceberg.catalog'='location_based_table');在现有 Iceberg 表之上创建表
你也可以创建一个由自定义 catalog 管理的新表。例如,以下代码在一个自定义 Hadoop catalog 中创建表:
SET
iceberg.catalog.hadoop_cat.type=hadoop;
SET
iceberg.catalog.hadoop_cat.warehouse=hdfs://example.com:8020/hadoop_cat;
CREATE TABLE database_a.table_a
(
id bigint,
name string
) PARTITIONED BY (
dept string
) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
TBLPROPERTIES ('iceberg.catalog'='hadoop_cat');::: 危险
如果要创建的表在自定义 catalog 中已经存在,这将创建一个受管覆盖表(managed overlay table)。这意味着在技术上,创建覆盖表时可以省略 EXTERNAL 关键字。但不建议这样做,因为创建受管覆盖表存在风险:如果 Hive 侧意外执行了 drop table 命令,就会影响到共享的数据文件,从而无意间删除表中的所有数据。
ALTER TABLE
表属性
对于 HiveCatalog 表,Iceberg 表属性与存储在 HMS 中的 Hive 表属性会保持同步。
::: 信息
重要:此功能不适用于其他 Catalog 实现。
:::
ALTER TABLE t SET TBLPROPERTIES('...'='...');模式演进
Hive 表的模式与 Iceberg 表保持同步。如果有外部来源(Impala/Spark/Java API 等)修改了模式,Hive 表会立即反映这些变化。你可以使用 Hive 命令修改表模式:
重命名表
ALTER TABLE orders RENAME TO renamed_orders;添加列
ALTER TABLE orders ADD COLUMNS (nickname string);重命名列
ALTER TABLE orders CHANGE COLUMN item fruit string;调整列顺序
ALTER TABLE orders CHANGE COLUMN quantity quantity int AFTER price;修改列类型——仅当 Iceberg 认为该列类型变更是安全的时才允许
ALTER TABLE orders CHANGE COLUMN price price long;使用 REPLACE COLUMN 删除旧列,从而删除列
ALTER TABLE orders REPLACE COLUMNS (remaining string);
Info
请注意,删除列是 REPLACE COLUMNS 唯一可用于的操作,也就是说,如果指定的列顺序不正确,将会抛出错误以提示这一限制。
分区演进
使用以下命令更改分区方案:
将分区方案更改为新的 identity 分区:
ALTER TABLE default.customers SET PARTITION SPEC (last_name);或者,提供一个分区规范:
ALTER TABLE order SET PARTITION SPEC (month(ts));
表迁移
你可以使用以下命令将 Avro / Parquet / ORC 外部表迁移为 Iceberg 表:
ALTER TABLE t SET TBLPROPERTIES ('storage_handler'='org.apache.iceberg.mr.hive.HiveIcebergStorageHandler');在迁移过程中,数据文件不会被修改,只会创建相应的 Iceberg 元数据文件。迁移完成后,即可将该表作为普通的 Iceberg 表来使用。
删除分区
你可以使用以下命令,基于单个/多个分区规范来删除分区:
ALTER TABLE orders DROP PARTITION (buy_date == '2023-01-01', market_price > 1000), PARTITION (buy_date == '2024-01-01', market_price <= 2000);分区规范仅支持恒等(identity)分区列。分区规范中不支持转换(transform)分区列。
分支与标签
ALTER TABLE ... CREATE BRANCH
可以通过 CREATE BRANCH 语句创建分支,并支持以下选项:
- 使用默认属性创建分支。
- 在指定的快照 ID 处创建分支。
- 使用系统时间创建分支。
- 创建分支时指定快照保留数量。
- 基于指定的标签创建分支。
-- CREATE branch1 with default properties.
ALTER TABLE test CREATE BRANCH branch1;
-- CREATE branch1 at a specific snapshot ID.
ALTER TABLE test CREATE BRANCH branch1 FOR SYSTEM_VERSION AS OF 3369973735913135680;
-- CREATE branch1 using system time.
ALTER TABLE test CREATE BRANCH branch1 FOR SYSTEM_TIME AS OF '2023-09-16 09:46:38.939 Etc/UTC';
-- CREATE branch1 with a specified number of snapshot retentions.
ALTER TABLE test CREATE BRANCH branch1 FOR SYSTEM_VERSION AS OF 3369973735913135680 WITH SNAPSHOT RETENTION 5 SNAPSHOTS;
-- CREATE branch1 using a specific tag.
ALTER TABLE test CREATE BRANCH branch1 FOR TAG AS OF tag1;ALTER TABLE ... CREATE TAG
可以通过 CREATE TAG 语句创建标签,并支持以下选项:
- 使用默认属性创建标签。
- 在指定的快照 ID 处创建标签。
- 基于系统时间创建标签。
-- CREATE tag1 with default properties.
ALTER TABLE test CREATE TAG tag1;
-- CREATE tag1 at a specific snapshot ID.
ALTER TABLE test CREATE TAG tag1 FOR SYSTEM_VERSION AS OF 3369973735913135680;
-- CREATE tag1 using system time.
ALTER TABLE test CREATE TAG tag1 FOR SYSTEM_TIME AS OF '2023-09-16 09:46:38.939 Etc/UTC';ALTER TABLE ... DROP BRANCH
分支可以通过 DROP BRANCH 语句删除,支持以下选项:
- 配合
IF EXISTS,在分支不存在时不报错
-- DROP branch1
ALTER TABLE test DROP BRANCH branch1;
-- DROP branch1 IF EXISTS
ALTER TABLE test DROP BRANCH IF EXISTS branch1;ALTER TABLE ... DROP TAG
可以通过 DROP TAG 语句删除标签,支持以下选项:
- 使用 IF EXISTS,即使标签不存在也不会报错
-- DROP tag1
ALTER TABLE test DROP TAG tag1;
-- DROP tag1 IF EXISTS
ALTER TABLE test DROP TAG IF EXISTS tag1;ALTER TABLE ... EXECUTE FAST-FORWARD
作为另一个分支祖先的 Iceberg 分支,可以快进(fast-forward)到该另一个分支的状态。
-- This fast-forwards the branch1 to the state of main branch of the Iceberg table.
ALTER table test EXECUTE FAST-FORWARD 'branch1' 'main';
-- This fast-forwards the branch1 to the state of branch2.
ALTER table test EXECUTE FAST-FORWARD 'branch1' 'branch2';ALTER TABLE ... EXECUTE CHERRY-PICK
快照的 cherry-pick 需要提供该快照的 ID。目前,快照的 cherry-pick 仅支持在 Iceberg 表的 main 分支上进行。
ALTER table test EXECUTE CHERRY-PICK 8602659039622823857;TRUNCATE TABLE
以下命令用于清空 Iceberg 表:
TRUNCATE TABLE t;TRUNCATE TABLE ... PARTITION
以下命令会截断 Iceberg 表中的分区:
TRUNCATE TABLE orders PARTITION (customer_id = 1, first_name = 'John');分区规范仅支持恒等(identity)分区列,不支持分区规范中的转换(transform)分区列。
删除表
可以使用 DROP TABLE 命令删除表:
DROP TABLE [IF EXISTS] table_name [PURGE];METADATA LOCATION
元数据位置(快照位置)只有在新路径包含完全相同的元数据 JSON 文件时才能更改。此操作只能在表迁移到 Iceberg 之后进行,这两个操作无法在一步中同时完成。
ALTER TABLE t set TBLPROPERTIES ('metadata_location'='<path>/hivemetadata/00003-a1ada2b8-fc86-4b5b-8c91-400b6b46d0f2.metadata.json');DML 命令
SELECT
在 Hive 中,SELECT 语句对 Iceberg 表的使用方式完全相同。但在编译和执行阶段,你会看到 Iceberg 相比 Hive 的优势:
- 无需列举文件系统 —— 这在 S3 等对象存储上尤为重要
- 无需从 Metastore 列举分区
- 高级分区过滤 —— 当分区键可以被计算得出时,查询中无需显式包含分区键
- 相比普通 Hive 表,能够处理数量更多的分区
以下是 Iceberg Hive 读取支持的功能亮点:
- 谓词下推:已实现 Hive SQL
WHERE子句的下推,使这些过滤条件不仅在 IcebergTableScan层面生效,也能被 Parquet 和 ORC 读取器使用。 - 列裁剪:Hive SQL
SELECT子句中的列会被下推到 Iceberg 读取器,从而减少读取的列数。 - Hive 查询引擎:在 Hive 4.x 中,支持 Tez 查询执行引擎。
部分高级或较少使用的优化尚未在 Iceberg 表上实现,因此你需要针对具体查询进行验证。此外,目前查询规划仍会使用 Metastore 中存储的统计信息,这是我们计划在未来改进的方面。
Hive 4 支持在分支上执行 select 操作,其行为与表级别的 select 操作类似。不过,分支必须按如下方式提供——
-- Branches should be specified as <database_name>.<table_name>.branch_<branch_name>
SELECT * FROM default.test.branch_branch1;INSERT INTO
Hive 支持标准的单表 INSERT INTO 操作:
INSERT INTO table_a
VALUES ('a', 1);
INSERT INTO table_a
SELECT...;多表插入同样受支持,但不具备原子性。提交会按表逐个进行。在提交过程中,部分更改可能会被看到,失败也可能导致部分更改已被提交。单个表内的更改仍保持原子性。
对分支执行插入操作,其行为与表级别的选择操作类似。不过,分支的指定方式必须如下——
-- Branches should be specified as <database_name>.<table_name>.branch_<branch_name>
INSERT INTO default.test.branch_branch1
VALUES ('a', 1);
INSERT INTO default.test.branch_branch1
SELECT...;以下是同时向多个表插入数据的 Hive SQL 示例:
FROM customers
INSERT INTO target1 SELECT customer_id, first_name
INSERT INTO target2 SELECT last_name, customer_id;INSERT INTO ... PARTITION
Hive 4 支持分区级别的 INSERT INTO 操作:
INSERT INTO table_a PARTITION (customer_id = 1, first_name = 'John')
VALUES (1,2);
INSERT INTO table_a PARTITION (customer_id = 1, first_name = 'John')
SELECT...;分区规范仅支持标识(identity)分区列,不支持分区规范中的转换(transform)分区列。
INSERT OVERWRITE
INSERT OVERWRITE 可以用查询结果替换表中的数据。对 Iceberg 表而言,覆盖是原子操作。对于非分区表,表的内容总是会被全部移除;对于分区表,则只会替换 SELECT 查询所产生的行所在的分区。
INSERT OVERWRITE TABLE target SELECT * FROM source;INSERT OVERWRITE ... PARTITION
Hive 4 支持分区级别的 INSERT OVERWRITE 操作:
INSERT OVERWRITE TABLE target PARTITION (customer_id = 1, first_name = 'John') SELECT * FROM source;分区规范仅支持标识(identity)分区列,不支持分区规范中的转换(transform)分区列。
DELETE FROM
Hive 4 支持 DELETE FROM 查询,用于从表中删除数据。
删除查询接受一个过滤条件,以匹配需要删除的行。
DELETE FROM target WHERE id > 1 AND id < 10;
DELETE FROM target WHERE id IN (SELECT id FROM source);
DELETE FROM target WHERE id IN (SELECT min(customer_id) FROM source);如果删除过滤器匹配的是表的整个分区,Iceberg 将执行仅涉及元数据的删除操作;如果匹配的是表中的单行数据,Iceberg 则会重写受影响的数据文件。
UPDATE
Hive 4 支持 UPDATE 查询,可接受一个过滤器来匹配需要更新的行。
UPDATE target SET first_name = 'Raj' WHERE id > 1 AND id < 10;
UPDATE target SET first_name = 'Raj' WHERE id IN (SELECT id FROM source);
UPDATE target SET first_name = 'Raj' WHERE id IN (SELECT min(customer_id) FROM source);如需了解基于传入数据的更复杂的行级更新,请参阅 MERGE INTO 一节。
MERGE INTO
Hive 4 新增了对 MERGE INTO 查询的支持,可用于表达行级更新。
MERGE INTO 使用来自另一查询(称为源)的一组更新来更新某个表(称为目标表)。目标表中某一行的更新通过 ON 子句来确定,该子句类似于连接条件。
MERGE INTO target AS t -- a target table
USING source s -- the source updates
ON t.id = s.id -- condition to find updates for target rows
WHEN ... -- updates目标表中行的更新使用 WHEN MATCHED ... THEN ... 列出。可以添加多个 MATCHED 子句,并通过条件决定每个匹配何时生效,系统会使用第一个匹配的表达式。
WHEN MATCHED AND s.op = 'delete' THEN DELETE
WHEN MATCHED AND t.count IS NULL AND s.op = 'increment' THEN UPDATE SET t.count = 0
WHEN MATCHED AND s.op = 'increment' THEN UPDATE SET t.count = t.count + 1未匹配的源行(更新)可以被插入:
WHEN NOT MATCHED THEN INSERT VALUES (s.a, s.b, s.c)源数据中只能有一条记录更新目标表的给定行,否则将抛出错误。
查询元数据表
Hive 支持查询 Iceberg 元数据表。这些表可以像普通的 Hive 表一样使用,因此可以进行投影、连接、过滤等操作。要引用元数据表,应使用表的完整名称,例如:……
目前 Hive 中可用的元数据表如下:
- all_data_files
- all_delete_files
- all_entries
- all_files
- all_manifests
- data_files
- delete_files
- entries
- files
- history
- manifests
- metadata_log_entries
- partitions
- refs
- snapshots
SELECT * FROM default.table_a.files;TIMETRAVEL
Hive 支持基于快照 ID 和基于时间的时间旅行查询。对于这些视图,可以使用投影 / 连接 / 过滤等操作。该功能可通过以下语法使用:
SELECT * FROM table_a FOR SYSTEM_TIME AS OF '2021-08-09 10:35:57';
SELECT * FROM table_a FOR SYSTEM_VERSION AS OF 1234567;你可以使用 Hive 中的 ALTER TABLE 查询来过期 Iceberg 表的快照。应定期过期快照,以删除不再需要的数据文件,并减小表元数据的大小。
从 Hive 对 Iceberg 表的每次写入都会创建该表的一个新快照,即新版本。快照可用于时间旅行查询,也可以将表回滚到任意有效快照。快照会不断累积,直到被 expire_snapshots 操作过期为止。输入以下查询来过期早于时间戳 2021-12-09 05:39:18.689000000 的快照:
ALTER TABLE test_table EXECUTE expire_snapshots('2021-12-09 05:39:18.689000000');DELETE ORPHAN-FILES
用于删除未被 Iceberg 表的任何元数据文件所引用的文件,这类文件因此可以被视为"孤立文件"。该功能的语法如下:
ALTER TABLE table_a EXECUTE DELETE ORPHAN-FILES;
ALTER TABLE table_a EXECUTE DELETE ORPHAN-FILES OLDER THAN ('2021-12-09 05:39:18.689000000');类型兼容性
Hive 和 Iceberg 支持的类型集合并不相同。Iceberg 可以自动执行类型转换,但并非适用于所有组合,因此在设计表中各列的类型之前,你可能需要先了解 Iceberg 中的类型转换机制。你可以通过 Hadoop 配置启用自动转换(默认不启用):
| 配置项 | 默认值 | 说明 |
|---|---|---|
| iceberg.mr.schema.auto.conversion | false | Hive 是否执行类型自动转换 |
Hive 类型到 Iceberg 类型
下表描述了 Hive 类型如何转换为 Iceberg 类型。该转换既适用于创建 Iceberg 表,也适用于通过 Hive 写入 Iceberg 表。
| Hive | Iceberg | 说明 |
|---|---|---|
| boolean | boolean | |
| short | integer | 自动转换 |
| byte | integer | 自动转换 |
| integer | integer | |
| long | long | |
| float | float | |
| double | double | |
| date | date | |
| timestamp | timestamp without timezone | |
| timestamplocaltz | timestamp with timezone | 仅 Hive 3 |
| interval_year_month | 不支持 | |
| interval_day_time | 不支持 | |
| char | string | 自动转换 |
| varchar | string | 自动转换 |
| string | string | |
| binary | binary | |
| decimal | decimal | |
| struct | struct | |
| list | list | |
| map | map | |
| union | 不支持 |
表回滚
将 Iceberg 表的数据回滚到某个较早表快照时的状态。
回滚到特定时间戳之前的最后一个快照
ALTER TABLE ice_t EXECUTE ROLLBACK('2022-05-12 00:00:00')回滚到特定快照 ID
ALTER TABLE ice_t EXECUTE ROLLBACK(1111);压缩(Compaction)
Hive 4 支持通过以下命令对 Iceberg 表执行全表压缩:
-- Using the ALTER TABLE ... COMPACT syntax
ALTER TABLE t COMPACT 'major';
-- Using the OPTIMIZE TABLE ... REWRITE DATA syntax
OPTIMIZE TABLE t REWRITE DATA;这两种语法的作用相同,都是对 Iceberg 表执行全表压缩。
评论
登录后参与评论
KnowForge