Apache Iceberg 是一种开源表格式,用于分析工作负载,支持架构演变、时间旅行和隐藏分区等功能。 与 Delta Lake 一样,Iceberg 会创建一个抽象层,该层允许对对象存储中的数据执行 ACID 事务。
Azure Databricks 支持使用 Apache Parquet 文件格式的 Iceberg 表,以及 Iceberg 规范的 1、2 和 3 版。 Iceberg 通过为每次表更改写入新的元数据文件来保持原子性和一致性。 Azure Databricks中的所有 Iceberg 表都遵循开放式 Iceberg 表格式规范。 请参阅 Iceberg 表规格。
Iceberg 目录是 Iceberg 表体系结构的顶级层,在加载表时返回当前元数据。 Iceberg 目录处理创建、删除和重命名表等操作。
Azure Databricks支持由以下方式管理的 Iceberg 表:
- Unity Catalog
- 外部目录,例如 AWS Glue、Hive 元数据存储或 Snowflake Horizon Catalog
Requirements
要使用 Apache Iceberg 托管表或外部表,必须满足以下要求:
- 使用已启用 Unity Catalog 的工作区。
- 使用 Databricks Runtime 16.4 LTS 或更高版本。
对于托管表,还必须满足以下要求:
- 已启用无服务器计算的工作区
Azure Databricks使用无服务器计算来维护托管表的 Iceberg 表元数据。 无服务器计算必须与支持表的云存储帐户建立网络连接。 如果防火墙保护存储帐户,请配置无服务器网络连接,以便无服务器计算可以访问它。 所需的设置取决于云。 有关详细信息,请参阅 无服务器计算平面网络。
在 Unity Catalog 中创建 Iceberg 表
您在 Unity Catalog 中创建的 Iceberg 表是托管 Iceberg 表。 可以使用以下方法创建这些表:
- Databricks Runtime 或 Databricks SQL
- 支持 Iceberg REST 目录 API 的外部 Iceberg 兼容引擎,例如 Apache Spark、Flink、Trino 或 Kafka。 请参阅来自 Apache Iceberg 客户端的 Access Azure Databricks表。
托管 Iceberg 表已与 Azure Databricks 平台功能完全集成:
- Unity 目录管理这些表上的快照过期和文件压缩等生命周期任务。
- 液体聚类 分析可提高查询性能。
- 预测优化 可自动执行操作,以降低存储成本并提高查询速度。
- 具体化视图 支持增量刷新,以便在源数据更改时使结果保持最新。
- 流式表支持使用 Databricks SQL 从 Kafka 和云对象存储中增量加载数据。
Databricks 建议使用 Iceberg 客户端版本 1.9.2 及更高版本来读取和写入 Unity 目录。
读取由其他目录管理的 Iceberg 表
外部 Iceberg 表是指由 Unity Catalog 之外的目录管理的 Iceberg 表。 外部目录存储表的当前元数据。 Azure Databricks使用 Lakehouse Federation 从对象存储中检索元数据和读取表。
外部 Iceberg 表在 Azure Databricks 中为只读,并且仅支持限定的平台。
使用外部系统访问 Iceberg 表
可以使用 Iceberg REST 目录 API 访问 Unity 目录中的所有 Iceberg 表。 此开放 API 支持跨不同语言和平台进行外部 Iceberg 引擎的读取和写入操作。 请参阅来自 Apache Iceberg 客户端的 Access Azure Databricks表。
REST 目录支持凭据售货,它将临时凭据传送到外部引擎以访问基础存储。 有关详细信息,请参阅 Unity Catalog 外部系统访问凭据发放。
警告
使用默认存储的工作区不支持凭据售货。 请参阅限制。
克隆托管 Iceberg 表
可以使用 DEEP CLONE 创建托管 Iceberg 表的完整独立副本。 深度克隆会将表的数据文件和元数据复制到 Unity Catalog 中的一个新的托管 Iceberg 表中。 请参阅克隆托管 Iceberg 表。
创建与外部 Iceberg 读取器兼容的物化视图
Important
托管 Iceberg 具体化视图现为公开预览版。 若要启用此功能,请联系 Databricks 帐户团队。
可以创建与外部 Iceberg 读取器兼容的 具体化视图 。 若要创建一个,请在 USING ICEBERG 语句中使用 CREATE MATERIALIZED VIEW。 有关完整语法,请参阅CREATE MATERIALIZED VIEW(管道)。 有关完整要求,请参阅启用对流式处理表和具体化视图的外部数据访问。
CREATE MATERIALIZED VIEW <mv_name>
USING ICEBERG
AS
SELECT * FROM samples.nyctaxi.trips;
创建具体化视图后,使用 REPAIR TABLE 运行 SYNC METADATA。 请参阅 REPAIR TABLE。
REPAIR TABLE <mv_name> SYNC METADATA;
外部 Iceberg 读取器可以读取具体化视图,但无法向其写入数据。 若要从外部 Iceberg 读取器读取具体化视图,请参阅启用对流式处理表和具体化视图的外部数据访问。
分区演变
通过分区演变,可以更改现有 Apache Iceberg 表的分区方案,而无需重写数据。 使用更新的分区布局写入新数据,现有数据保留其原始分区布局。 Apache Iceberg 跟踪分区规格,并在查询时应用正确的筛选器。 请参阅 Apache Iceberg 的分区演变。
注释
托管 Iceberg 表支持通过外部 Iceberg 引擎使用 Iceberg REST Catalog 进行分区演进,但不支持通过 Databricks SQL 进行。 托管 Iceberg 表不支持基于表达式的分区转换,例如 years() 和 bucket()。 请参阅限制。
若要配置外部访问,请参阅 从 Apache Iceberg 客户端访问 Azure Databricks 表。
以下示例演示如何将分区演变与 Spark SQL 和 Iceberg 扩展配合使用。 有关 Apache Iceberg 分区演变语法和支持的转换,请参阅 Apache Iceberg Spark DDL。
添加分区字段
若要向现有表添加新分区字段,请:
ALTER TABLE catalog.schema.table ADD PARTITION FIELD column_name;
删除分区字段
若要从表中删除现有分区字段,请:
ALTER TABLE catalog.schema.table DROP PARTITION FIELD column_name;
替换分区字段
若要将一个分区字段换到另一个,而无需中间重新分区:
ALTER TABLE catalog.schema.table REPLACE PARTITION FIELD old_column WITH new_column;
限制
以下限制适用于 Azure Databricks 中的 Iceberg 表,并可能会更改:
- Iceberg 表仅支持 Apache Parquet 文件格式。
- 对于 Iceberg v2,不支持位置删除和基于相等的删除。 相反,Azure Databricks支持用于行级删除的 Iceberg v3 删除向量。
- 不支持分支和标记。 读取外部 Iceberg 表时,只能访问主分支。
- 分区:
- 仅当从外部 Iceberg 引擎交互时,托管的 Iceberg 表才支持分区演变。
- 外部 Iceberg 表不支持分区演进。
- 不支持按
BINARY类型进行分区。
- 外部 Iceberg 引擎无法读取视图。 在 Unity Catalog 中,Iceberg REST 目录 API 允许表可用,但不提供视图。
- 不支持以下数据类型:
UUIDFixed(L)TIME- 带必填字段的嵌套
STRUCT
- 有关特定于 Iceberg v3 的限制,请参阅“限制”。
托管型 Iceberg 表的局限性
以下局限性仅限于托管型 Iceberg 表:
- 不支持 AI 搜索。 请参阅 Databricks AI 搜索。
- 如果您将托管 Iceberg 表用作 Lakebase 同步表的数据源,则不支持使用自动变更数据馈送进行增量处理。
- 仅当为表维护启用了 预测优化 时,才能创建托管 Iceberg 表。
- 下表属性由 Unity 目录管理,无法手动设置:
write.location-provider.implwrite.data.pathwrite.metadata.pathwrite.format.defaultwrite.delete.format.default
- 不支持用于更改表压缩的压缩编解码器。 默认情况下,所有表都使用 Zstd。
- 不支持按表达式(例如、
years()、months()days()、hours()、bucket())进行分区。 - Apache Iceberg 不支持的功能也不适用于托管的 Iceberg 表。 这包括 Delta Lake 生成的列、Azure Databricks 上的约束以及 Delta Lake 的排序规则支持。
外部 Iceberg 表的局限性
以下局限性仅限于外部 Iceberg 表:
- 在 Azure Databricks 中,时间旅行功能仅适用于已经被读取过的 Iceberg 快照(即已执行过
SELECT语句的快照)。 - 使用用于 Iceberg 分区的存储桶转换函数可能会降低使用条件筛选器时的查询性能。
- 云存储分层产品(如 Amazon S3)未与外部 Iceberg 表集成。 在 Azure Databricks 中访问外部 Iceberg 表可以还原存档于低成本存储层级的数据。
- 在专用访问模式群集上,需要
REFRESH FOREIGN TABLE才能对 Iceberg 表执行读取和ALL PRIVILEGES操作。 - 在外部目录中定义的视图无法作为 Iceberg 表读取。 如果某个外部目录暴露了基于 Iceberg 表构建的视图,Azure Databricks 会通过 JDBC 的查询联合读取视图,而不是直接读取 Iceberg 数据,这会降低性能。