在 Azure Databricks 中的 Unity Catalog 托管 Delta Lake 和 Apache Iceberg 表

重要

Unity Catalog 托管的 Delta Lake 表已一般可用。 Unity 目录托管的 Apache Iceberg 表在 公共预览 阶段,适用于 Databricks Runtime 16.4 LTS 及更高版本。

本页介绍 Delta Lake 和 Apache Iceberg 中的 Unity 目录托管表,这是Azure Databricks中默认和建议的表类型。 与 外部表和外部表以外的表相比,这些表由 Unity Catalog 完全治理和优化,提供更好的性能和操作优势,以及较低的存储和计算成本,因为托管表会从您的读取和写入模式中学习。 Unity 目录管理托管表的所有读取、写入、存储和优化责任。 请参阅 将外部 Delta 表转换为托管 Unity 目录表

托管表的数据文件存储在包含它们的架构或目录中。 请参阅 在 Unity 目录中指定托管存储位置

Databricks 建议使用托管表来利用:

  • 降低了存储和计算成本。
  • 跨所有客户端类型加快查询性能。
  • 自动数据表维护和优化。
  • 通过打开的 API 保护非 Databricks 客户端的访问。
  • 支持 Delta Lake 和 Iceberg 格式。
  • 自动升级到最新的平台功能。

托管表通过允许从 Delta Lake 和 Iceberg 客户端进行访问来支持互作性。 通过开放 API 和凭据发放,Unity Catalog 使外部引擎(如 Trino、DuckDB、Apache Spark、Daft)以及与 Iceberg REST 集成的目录引擎(如 Dremio)能够访问管理表。 对于不支持开放 API 的外部客户端,可以使用 兼容性模式 通过任何 Delta Lake 或 Iceberg 客户端读取托管表。 Delta Sharing(开放源代码协议)可实现与外部合作伙伴和平台的安全、受管理的数据共享。

可以在Azure Databricks支持的所有语言和产品中使用托管表。 需要某些权限才能创建、更新、删除或查询托管表。 请参阅 Unity 目录中的管理特权

注释

此页面仅描述 Unity 目录托管表。 有关旧 Hive 元存储中的托管表,请参阅 旧 Hive 元存储中的数据库对象

为何使用 Unity 目录托管表?

Unity 目录托管表优化存储成本和查询速度,并允许与 Delta Lake 和 Apache Iceberg 的第三方工具的互操作性。 为了简化数据管理和性能,这些托管表使用 AI 提供支持的技术,例如文件大小压缩和智能统计信息收集。

以下功能仅适用于 Unity Catalog 托管表,不适用于外部表和外来表:

功能 / 特点 优点 默认情况下是否启用? 可配置?
目录提交 支持跨表多语句事务、通过直接从 Unity Catalog 提供元数据来加快查询规划速度、可强制执行架构和约束变更,以及支持从外部引擎安全写入。 否。 是的。
设置delta.feature.catalogManaged表属性。 请参阅 “启用目录提交”。
多语句事务 允许对一个或多个表执行多条 SQL 语句,并作为一次原子提交,且具备 ACID 保证。 所有更改要么一起成功,要么一起回滚。 用于任务关键型仓库工作负荷中的 存储过程SQL 脚本
对托管 Delta Lake 表进行写入的事务目前处于公开预览阶段。
写入托管 Apache Iceberg 表的事务目前处于专属预览阶段。
否。 是的。 对于非交互式事务,请使用 BEGIN ATOMIC ... END;;对于交互式事务,请使用 BEGIN TRANSACTION; ... COMMIT;。 请参阅 事务模式
自动液体聚类分析 随着查询模式的变化,Azure Databricks自动更新群集密钥以提高性能和降低成本。 否。 是的。 请参阅启用液体聚类
元数据缓存 事务元数据的内存中缓存可最大程度地减少对存储在云中的事务日志的请求,从而提高查询性能。 是的。 否。 始终为托管表启用元数据缓存。
二级全文搜索索引 索引加速对托管表列的选择性查找。 应用索引时,Azure Databricks跳过不能包含匹配行的文件,从而减少扫描的数据量。
全文搜索索引使用 searchisearch 函数加快子字符串和字词查找的速度。 二级索引可加快等值和 IN 谓词的处理速度。
两种索引类型都在 Beta 版中,需要 Databricks Runtime 18.2 及更高版本。
否。 是的。 使用 CREATE INDEX(次要)或 CREATE SEARCH INDEX(全文)进行创建。
命令后 DROP TABLE 自动删除文件 如果您DROP托管表,Azure Databricks 会在 8 天后删除云存储中的数据,以降低存储成本。 对于外部表,必须手动从存储存储桶中删除文件。 是的。 否。 对于托管表,文件始终在 8 天后自动删除。

使用外部系统来访问 Databricks 数据

托管表通过允许从 Delta Lake 和 Iceberg 客户端进行访问来支持 互作性 。 通过开放 API 和凭据分发,Unity 目录服务支持外部引擎(如 Trino、DuckDB、Apache Spark、Daft)以及 Iceberg REST 目录集成的引擎(如 Dremio 和 Snowflake)来访问托管表。 请参阅集成以获取受支持的外部引擎列表,或者如果您的引擎未包含在此列表中,请检查其文档。

以下开放 API 提供对 Unity 目录托管表的外部系统访问权限:

  • Unity REST API:提供对托管 Delta 表的 Delta 客户端的读取、写入和创建访问权限。
  • Iceberg REST 目录 (IRC):提供 Iceberg 客户端对 Iceberg 表进行读取、写入和创建的访问权限,并提供对启用 Iceberg 读取的 Delta 表的只读访问权限(UniForm)。

这两个 API 都支持凭据派发(c0),该功能提供临时的、特定范围的凭据,这些凭据继承请求主体(Azure Databricks 主体)的特权,维持治理和安全控制。

此外,Delta Sharing 是一种开放源代码协议,允许对外部合作伙伴和平台进行安全和管理的数据访问。 可以使用 Delta Sharing 向合作伙伴授予临时只读访问权限。

对托管表的所有读取和写入都必须使用表名称和目录和架构名称(如果存在)。 例如,catalog_name.schema_name.table_name。 不支持对 Unity 目录托管表进行基于路径的访问(在 兼容模式下除外),因为它绕过 Unity 目录访问控制并阻止托管表功能正常工作。

创建托管表

若要创建托管表,你必须具备:

  • 对表父架构的 USE SCHEMA 权限。
  • 对表父级目录的 USE CATALOG 特权。
  • 对表父架构的 CREATE TABLE 权限。

使用以下 SQL 语法通过 SQL 创建空托管表。 替换占位符值

  • <catalog-name>:将包含表的目录的名称。
  • <schema-name>:包含表的架构名称。
  • <table-name>:表的名称。
  • <column-specification>:每个列的名称和数据类型。
-- Create a managed Delta table
CREATE TABLE <catalog-name>.<schema-name>.<table-name>
(
  <column-specification>
);

-- Create a managed Iceberg table
CREATE TABLE <catalog-name>.<schema-name>.<table-name>
(
  <column-specification>
)
USING iceberg;

为了保持读取和写入的性能,Azure Databricks定期运行操作以优化托管的 Iceberg 表元数据。 此任务使用无服务器计算执行,该计算对 Iceberg 表具有 MODIFY 权限。 此操作仅写入表的元数据,并且计算过程仅在任务期间维护对该表的权限。

注释

若要创建 Iceberg 表,请显式指定 USING iceberg。 否则,Azure Databricks 会默认创建 Delta Lake 表。

可以通过查询结果或 DataFrame 写操作创建托管表。 以下文章演示了可用于在 Azure Databricks 上创建托管表的一些模式:

删除托管表

若要删除托管表,你必须具备:

  • 表的 MANAGE 权限,或者你必须是表的所有者。
  • 对表父架构的 USE SCHEMA 权限。
  • 对表父级目录的 USE CATALOG 特权。

若要删除托管表,请运行以下 SQL 命令:

DROP TABLE IF EXISTS catalog_name.schema_name.table_name;

Unity 目录支持 UNDROP TABLE 命令在 8 天内恢复已删除的托管表。 8 天后,Azure Databricks标记要从云租户中删除的基础数据,并在自动表维护期间删除文件。 请参阅 UNDROP