目录(Catalog)

HiveCatalog

师成师成· 更新于 2026-09-28· 阅读 40 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

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 表的三种不同方式:

  1. 如果未设置 iceberg.catalog,则使用与 Hive 环境中所配置元存储相对应的 HiveCatalog 加载该表
  2. 如果 iceberg.catalog 设置为某个目录名称,则使用自定义目录加载该表(见下文)
  3. 如果 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_namedata_typecomment
iint
jint
NULLNULL
# Partition Transform InformationNULLNULL
# col_nametransform_typeNULL
jIDENTITYNULL

你可以使用以下 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_namedata_typecomment
iint
tstimestamp
NULLNULL
# 分区转换信息NULLNULL
# col_nametransform_typeNULL
tsMONTHNULL
iBUCKET[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 读取支持的功能亮点:

  1. 谓词下推:已实现 Hive SQL WHERE 子句的下推,使这些过滤条件不仅在 Iceberg TableScan 层面生效,也能被 Parquet 和 ORC 读取器使用。
  2. 列裁剪:Hive SQL SELECT 子句中的列会被下推到 Iceberg 读取器,从而减少读取的列数。
  3. 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.conversionfalseHive 是否执行类型自动转换

Hive 类型到 Iceberg 类型

下表描述了 Hive 类型如何转换为 Iceberg 类型。该转换既适用于创建 Iceberg 表,也适用于通过 Hive 写入 Iceberg 表。

HiveIceberg说明
booleanboolean
shortinteger自动转换
byteinteger自动转换
integerinteger
longlong
floatfloat
doubledouble
datedate
timestamptimestamp without timezone
timestamplocaltztimestamp with timezone仅 Hive 3
interval_year_month不支持
interval_day_time不支持
charstring自动转换
varcharstring自动转换
stringstring
binarybinary
decimaldecimal
structstruct
listlist
mapmap
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 表执行全表压缩。

评论

登录后参与评论

正在加载评论…