什么是 Azure Databricks 中的 Apache Iceberg?

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 表。 可以使用以下方法创建这些表:

托管的 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 类型进行分区。
  • 不支持以下数据类型:
    • UUID
    • Fixed(L)
    • TIME
    • 嵌套 STRUCT 了必填字段
  • 托管的 Iceberg 表不支持主键或外键约束。

托管型 Iceberg 表的局限性

以下局限性仅限于托管型 Iceberg 表:

  • 不支持行筛选器和列掩码。
  • 不支持矢量搜索。
  • Iceberg 不支持 更改数据馈送。 因此,将托管的 Iceberg 表读取为源时,不支持增量处理:
    • 具体化视图和流式处理表
    • 数据分析
    • 在线表格
    • Lakebase
    • 数据分类
  • 仅当为表维护启用了 预测优化 时,才能创建托管 Iceberg 表。
  • 下表属性由 Unity 目录管理,无法手动设置:
    • write.location-provider.impl
    • write.data.path
    • write.metadata.path
    • write.format.default
    • write.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 操作。