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

Unity Catalog 托管表是 Azure Databricks 中适用于 Delta Lake 和 Apache Iceberg 的默认且推荐使用的表类型。 Unity 目录管理所有读取、写入、存储和优化责任。 请参阅 将外部 Delta Lake 表转换为 Unity Catalog 托管表

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

外部 表和 外来表相比,Databricks 建议使用托管表,以获得以下优势:

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

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

注释

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

Unity Catalog 托管表的优势

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

托管表通过允许从 Delta Lake 和 Apache Iceberg 客户端进行访问来支持互操作性。 请参阅使用外部系统来访问 Databricks 数据

以下功能是 Unity Catalog 托管表特有的,外部表和外部联邦表不具备这些功能:

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

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

托管表通过允许从 Delta Lake 和 Apache Iceberg 客户端进行访问来支持 互操作性

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

请参阅集成以获取受支持的外部引擎列表,或者如果您的引擎未包含在此列表中,请检查其文档。

以下开放 API 允许外部系统访问 Unity 目录托管表:

  • Unity REST API 允许 Delta Lake 客户端对受管 Delta Lake 表进行读取、写入和创建操作。
  • Iceberg REST Catalog (IRC) 为 Apache Iceberg 客户端提供对托管的 Apache Iceberg 表的读取、写入和创建访问权限,并为启用了 Apache Iceberg 读取(UniForm)的 Delta Lake 表提供只读访问权限。

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

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

对托管表的所有读取和写入都必须使用表名称和目录和架构名称(如果存在)。 例如,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定期运行操作以优化托管的 Apache Iceberg 表元数据。 此任务使用对 Apache Iceberg 表具有 MODIFY 权限的无服务器计算执行。 此操作仅写入表的元数据,并且计算过程仅在任务期间维护对该表的权限。

注释

若要创建 Apache 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 命令来恢复意外删除的托管表。 默认情况下,表在删除后可恢复 7 天。 恢复期结束后,Azure Databricks在 48 小时内从云租户中删除基础数据文件。

配置恢复期

重要

可配置的恢复期为 公共预览版

您可以在目录或架构级别配置已删除的托管表保持可恢复状态的时长。 如果在两个级别设置恢复期,则架构级设置优先于该架构中的表。

若要配置恢复期,必须在目录或架构上拥有 MANAGE 特权或所有权。 此设置仅适用于配置后删除的表。 它不会影响已经被删除的表。

恢复期可以设置为 0 小时(禁用恢复)或 7-30 天(含)。 更长的恢复期(最长为 30 天)可增加保护,防止意外删除关键生产数据。 较短的恢复期,或者将其设置为 0,会使被删除的数据更快被清除——这有助于为在 ETL 管道中频繁创建和删除表的工作负载节省成本。 将恢复期设置为 0 表示无法使用删除的表进行恢复 UNDROP。 数据文件在删除表后的 48 小时内从云存储中删除。

若要设置恢复期,请将 ALTER CATALOGALTER SCHEMARETAIN DROPPED TO 子句搭配使用:

-- Set a 30-day recovery period on a catalog
ALTER CATALOG my_catalog RETAIN DROPPED TO 30 DAYS;

-- Set a 7-day recovery period on a schema (overrides the catalog setting)
ALTER SCHEMA my_catalog.my_schema RETAIN DROPPED TO 7 DAYS;

还可以在使用 RETAIN DROPPED FOR 子句创建目录或架构时设置恢复期:

CREATE CATALOG my_catalog RETAIN DROPPED FOR 30 DAYS;
CREATE SCHEMA my_catalog.my_schema RETAIN DROPPED FOR 7 DAYS;

若要检查当前恢复期,请运行 DESCRIBE EXTENDED。 输出包括一个 Recovery Period Hours 行:

DESCRIBE CATALOG EXTENDED my_catalog;
DESCRIBE SCHEMA EXTENDED my_catalog.my_schema;