Important
Databricks Runtime 16.4 LTS 及更高版本中提供了 Unity Catalog 管理的 Iceberg 表的公共预览版。 在 Databricks Runtime 16.4 LTS 及更高版本中,外部 Iceberg 表也是公共预览版。
Iceberg v3 功能在 Databricks Runtime 18.0 及更高 版本中提供公共预览 版。 请参阅 使用 Apache Iceberg v3 功能。
Apache Iceberg 是用于分析工作负载的开源表格式。 它支持架构演变、时间旅行和隐藏分区等功能。 与 Delta Lake 一样,Iceberg 提供了一个抽象层,用于对存储在对象存储中的数据进行 ACID 事务。 Azure Databricks支持使用 Apache Parquet 文件格式的 Iceberg 表。 Iceberg 通过为每次表更改写入新的元数据文件来保持原子性和一致性。
Iceberg 目录处于 Iceberg 表体系结构的顶层。 它处理创建、删除和重命名表等作。 它的主要责任是在加载表时提供当前元数据。 Azure Databricks支持由以下方式管理的 Iceberg 表:
- Unity Catalog
- 外部目录,如 AWS Glue、Hive 元存储或 Snowflake Horizon 目录
Azure Databricks中的所有 Iceberg 表都遵循开放式 Iceberg 表格式规范。 请参阅 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 目录管理这些表上的快照过期和文件压缩等生命周期任务。 托管 Iceberg 表还支持 液体聚类分析,从而提高查询性能。 预测优化 可自动执行这些任务,以降低存储成本并提高查询速度。 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 外部系统访问凭据发放。
警告
使用默认存储的工作区不支持凭据售货。 请参阅限制。
分区演变
通过分区演变,可以更改现有 Apache Iceberg 表的分区方案,而无需重写数据。 使用更新的分区布局写入新数据,现有数据保留其原始分区布局。 Apache Iceberg 跟踪分区规格,并在查询时应用正确的筛选器。 请参阅 Apache Iceberg 的分区演变。
注释
使用 Iceberg REST 目录通过外部 Iceberg 引擎在托管 Iceberg 表上支持分区演变,但不支持通过 Databricks SQL 进行分区演变。 托管 Iceberg 表不支持基于表达式的分区转换,例如 years() 和 bucket()。 请参阅 Iceberg 表限制。
若要配置外部访问,请参阅 从 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;
Iceberg 表的局限性
以下限制适用于 Azure Databricks 中的 Iceberg 表,并可能会更改:
- Iceberg 表仅支持 Apache Parquet 文件格式。
- Azure Databricks支持 Iceberg 规范的版本 1、2 和 3。
- 有关 v3 特定的限制,请参阅 “限制”。
- Iceberg v2 不支持状态删除和基于相等性删除。 相反,Azure Databricks支持用于行级删除的 Iceberg v3 删除向量。
- 不支持分支和标记。 读取外部 Iceberg 表时,只能访问主分支。
- 分区:
- 仅当从外部 Iceberg 引擎交互时,托管的 Iceberg 表才支持分区演变。
- 外部 Iceberg 表不支持分区演进。
- 不支持按
BINARY类型进行分区。
- 不支持视图。
- 不支持以下数据类型:
UUIDFixed(L)TIME- 必填字段的嵌套
STRUCT
托管型 Iceberg 表的局限性
以下局限性仅限于托管型 Iceberg 表:
- 不支持矢量搜索。
- Iceberg 不支持 更改数据馈送。 因此,将托管的 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操作。