重要
Unity 目录托管表通常用于 Delta Lake 表。 对于 Apache Iceberg 表,此功能以 公共预览版 提供,在 Databricks Runtime 16.4 LTS 及更高版本中可用。
本页介绍 Delta Lake 和 Apache Iceberg 中的 Unity 目录托管表,这是 Azure Databricks 中的默认表类型和建议表类型。 与 外部 表和 异构表相比,这些表受到 Unity Catalog 的完全治理和优化,提供性能、操作优势,以及较低的存储和计算成本,因为托管表能够从您的读取和写入模式中学习。 Unity 目录管理托管表的所有读取、写入、存储和优化责任。 请参阅 将外部表转换为托管 Unity 目录表。
托管表的数据文件存储在包含它们的架构或目录中。 请参阅 在 Unity 目录中指定托管存储位置。
Databricks 建议使用托管表来利用:
- 降低了存储和计算成本。
- 跨所有客户端类型加快查询性能。
- 自动数据表维护和优化。
- 通过打开的 API 保护非 Databricks 客户端的访问。
- 支持 Delta Lake 和 Iceberg 格式。
- 自动升级到最新的平台功能。
可以在 Azure Databricks 支持的所有语言和产品中使用托管表。 需要某些权限才能创建、更新、删除或查询托管表。 请参阅 Unity 目录中的管理特权。
注释
本页重点介绍 Unity 目录托管表。 有关旧 Hive 元存储中的托管表,请参阅 旧 Hive 元存储中的数据库对象。
为何使用 Unity 目录托管表?
Unity 目录托管表使用 AI 驱动的技术(例如自动群集、文件大小压缩和智能统计信息收集)自动优化存储成本和查询速度。 这些表使用自动清扫和元数据缓存等功能简化数据管理,同时确保与 Delta 和 Iceberg 第三方工具的互作性。
以下功能对于 Unity 目录托管表是唯一的,不适用于外部表和外表。
| 功能 / 特点 | 优点 | 默认情况下是否启用? | 配置? | 
|---|---|---|---|
| 自动液体聚类分析 | 随着查询模式的变化,Azure Databricks 自动更新群集密钥以提高性能和降低成本。 | 否 | 是的。 请参阅启用液体聚类。 | 
| 元数据缓存 | 事务元数据的内存中缓存可最大程度地减少对存储在云中的事务日志的请求,从而提高查询性能。 此功能可增强查询性能。 | 是的 | 否。 始终为托管表启用元数据缓存。 | 
| 命令后 DROP TABLE自动删除文件 | 如果 删除 托管表,Azure Databricks 将在 8 天后删除云存储中的数据,从而减少存储成本。 对于外部表,必须手动转到存储存储桶并删除文件。 | 是的 | 否。 对于托管表,文件始终在 8 天后自动删除。 | 
使用外部系统来访问 Databricks 数据
托管表通过允许从 Delta Lake 和 Iceberg 客户端进行访问来支持 互作性 。 通过开放 API 和凭据分发,Unity 目录服务支持外部引擎(如 Trino、DuckDB、Apache Spark、Daft)以及 Iceberg REST 目录集成的引擎(如 Dremio 和 Snowflake)来访问托管表。 请参阅集成以获取受支持的外部引擎列表,或者如果您的引擎未包含在此列表中,请检查其文档。
通过 Iceberg REST 目录(IRC),外部系统 可以读取和写入由 Unity Catalog 管理的表格,从而与非 Databricks 工具无缝集成,同时保持治理和安全控制。 Delta 客户端仅支持只读。
此外, Delta 共享 是一种开放源代码协议,允许对外部合作伙伴和平台进行安全和管理的数据访问。 可以使用 Delta Sharing 向合作伙伴授予临时只读访问权限。
对托管表的所有读取和写入都应使用表名和目录名称和架构名称(如果存在)。 例如,catalog_name.schema_name.table_name。 不建议使用基于路径的访问,因为它绕过 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。