Important
Databricks Runtime 16.4 LTS 及更高版本中提供了 Unity Catalog 管理的 Iceberg 表的公共预览版。 在 Databricks Runtime 16.4 LTS 及更高版本中,外部 Iceberg 表也是公共预览版。
Iceberg v3 的功能在 Databricks Runtime 17.3 及更高版本中以Beta版提供。 请参阅 使用 Apache Iceberg v3 功能。
Apache Iceberg 是用于分析工作负荷的开源表格式。 它支持架构演变、时间旅行和隐藏分区等功能。 与 Delta Lake 一样,Iceberg 提供了一个抽象层,用于对存储在对象存储中的数据进行 ACID 事务。 Azure Databricks 支持使用 Apache Parquet 文件格式的 Iceberg 表。 Iceberg 通过为每次表更改写入新的元数据文件来保持原子性和一致性。
Iceberg 目录处于 Iceberg 表体系结构的顶层。 它处理创建、删除和重命名表等作。 它的主要责任是在加载表时提供当前元数据。 Azure Databricks 支持以下列方式管理的 Iceberg 表:
Azure Databricks 中的所有 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 联邦 从对象存储中检索元数据和读取表。
外部 Iceberg 表在 Azure Databricks 中为只读,并且仅支持限定的平台。
使用外部系统访问 Iceberg 表
可以使用 Iceberg REST 目录 API 访问 Unity 目录中的所有 Iceberg 表。 此开放 API 支持跨不同语言和平台进行外部 Iceberg 引擎的读取和写入操作。 请参阅 Apache Iceberg 客户端中的 Access Azure Databricks 表。
REST 目录支持凭据售货,它将临时凭据传送到外部引擎以访问基础存储。 有关详细信息,请参阅 Unity Catalog 外部系统访问凭据发放。
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 不支持 更改数据馈送。 因此,将托管的 Iceberg 表读取为源时,不支持增量处理:
- 具体化视图和流式处理表
- 数据分析
- 在线表格
- Lakebase
- 数据分类
- 仅当为表维护启用了 预测优化 时,才能创建托管 Iceberg 表。
- 下表属性由 Unity 目录管理,无法手动设置:
write.location-provider.implwrite.data.pathwrite.metadata.pathwrite.format.defaultwrite.delete.format.default
- 不支持用于更改表压缩的压缩编解码器。 默认情况下,所有表都使用 Zstd。
- 不支持按表达式(例如、
years()、months()days()、hours()、bucket())进行分区。
外部 Iceberg 表的局限性
以下局限性仅限于外部 Iceberg 表:
- 只有先前在 Azure Databricks 中读取过的 Iceberg 快照(即执行过
SELECT语句的快照)才支持按时间顺序查看。 - 使用用于 Iceberg 分区的存储桶转换函数可能会降低使用条件筛选器时的查询性能。
- 云存储分层产品(如 Amazon S3)未与外部 Iceberg 表集成。 在 Azure Databricks 中访问外部 Iceberg 表可还原在低成本存储层中Databricks 存档的数据。
- 在专用访问模式群集上,需要
REFRESH FOREIGN TABLE才能对 Iceberg 表执行读取和ALL PRIVILEGES操作。