Unity Catalog 托管表是 Azure Databricks 中适用于 Delta Lake 和 Apache Iceberg 的默认且推荐使用的表类型。 Unity 目录管理所有读取、写入、存储和优化责任。 请参阅 将外部 Delta Lake 表转换为 Unity Catalog 托管表。
托管表的数据文件存储在包含它们的架构或目录中。 请参阅在 Unity Catalog 中指定托管存储位置。
与 外部 表和 外来表相比,Databricks 建议使用托管表,以获得以下优势:
- 降低了存储和计算成本。
- 跨所有客户端类型加快查询性能。
- 自动数据表维护和优化。
- 通过打开的 API 保护外部客户端的访问。
- 支持 Delta Lake 和 Apache Iceberg 格式。
- 自动升级到最新的平台功能。
可以在 Azure Databricks 支持的所有语言和产品中使用托管表。 需要某些权限才能创建、更新、删除或查询托管表。 请参阅在 Unity Catalog 中管理权限。
Note
此页面仅描述 Unity 目录托管表。 有关旧 Hive 元存储中的托管表,请参阅 旧 Hive 元存储中的数据库对象。
Unity Catalog 托管表的优势
Unity 目录托管表优化存储成本和查询速度,并允许与 Delta Lake 和 Apache Iceberg 的第三方工具的互操作性。 为了简化数据管理和性能,这些托管表使用由 AI 提供支持的技术,例如文件大小压缩和智能统计信息收集。
托管表通过允许从 Delta Lake 和 Apache Iceberg 客户端进行访问来支持互操作性。 请参阅使用外部系统来访问 Databricks 数据。
以下功能是 Unity Catalog 管理表所独有的,外部表和外部关联表不支持这些功能:
| Feature | Benefits | 配置 |
|---|---|---|
| 目录提交 | 支持跨表的多语句事务,通过直接从 Unity Catalog 提供元数据来加快查询规划,强制执行架构和约束变更,并支持来自外部引擎的安全写入。 | 默认情况下已关闭。 若要启用,请设置表属性 delta.feature.catalogManaged。 请参阅 “启用目录提交”。 |
| 预测优化 | 使用 AI 自动优化数据布局和计算,而无需手动维护操作。 Databricks 建议为所有托管表启用预测优化,以减少存储和计算成本。 自动运行: |
默认情况下,为在 2024 年 11 月 11 日或之后创建的所有新帐户启用。 对于当前帐户,默认情况下,Azure Databricks将逐步启用预测优化。 请参阅 “验证是否启用了预测优化”。 若要配置,请参阅 “启用预测优化”。 |
| 多语句事务 | 允许您将跨一个或多个表的多个 SQL 语句作为单个原子提交运行,并提供 ACID 保证。 所有更改要么全部成功,要么全部回滚。 用于任务关键型仓库工作负荷中的 存储过程 和 SQL 脚本 。 写入托管 Delta Lake 表的事务目前处于公开预览版阶段。 写入托管 Apache Iceberg 表的事务目前处于专属预览阶段。 |
默认情况下已关闭。 对于非交互式事务,请使用 BEGIN ATOMIC ... END;;对于交互式事务,请使用 BEGIN TRANSACTION; ... COMMIT;。 请参阅 事务模式。 |
| 自动液体聚类分析 | 对于 具有预测优化的表,液体聚类分析会智能地选择聚类分析键,并在查询模式发生变化时自动更新它们,以提高性能和降低成本。 | 默认情况下已关闭。 若要配置,请参阅 “启用液体聚类分析”。 |
| 元数据缓存 | 事务元数据的内存中缓存可最大程度地减少对存储在云中的事务日志的请求,从而提高查询性能。 | 默认启用。 不可配置。 |
| 全文搜索索引 | 使用 search 和 isearch 函数加速文本列的子字符串和关键字查找。 应用索引时,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 都支持凭据分发,提供临时、限定范围的凭证,这些凭证继承请求 Azure Databricks 主体的权限,并保持安全和治理控制。
OpenSharing 是一种开放源代码协议,允许对外部合作伙伴和平台进行安全和管理的数据访问。 可以使用 OpenSharing 授予合作伙伴临时只读访问权限。
对托管表的所有读取和写入都必须使用表名称和目录和架构名称(如果存在)。 例如,catalog_name.schema_name.table_name。 不支持对 Unity 目录托管表进行基于路径的访问(在 兼容模式下除外),因为它绕过 Unity 目录访问控制并阻止托管表功能正常工作。
创建托管表
若要创建托管表,你必须具备:
- 对表父架构的
USE SCHEMA权限。 - 对表父级目录的
USE CATALOG特权。 - 对表父架构的
CREATE TABLE权限。
使用以下语法创建空托管表。 替换占位符值:
-
<catalog-name>:将包含表的目录的名称。 -
<schema-name>:包含表的架构名称。 -
<table-name>:表的名称。 -
<column-specification>:每个列的名称和数据类型。
SQL
-- 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;
Python
使用 saveAsTable() 创建托管 Delta Lake 表:
from pyspark.sql.types import StructType, StructField, StringType
schema = StructType([StructField("<column-name>", StringType())])
spark.createDataFrame([], schema).write \
.saveAsTable("<catalog-name>.<schema-name>.<table-name>")
或者,使用 DeltaTableBuilder API 来指定 Delta 特有的选项,例如生成列和表属性:
from delta.tables import DeltaTable
DeltaTable.create(spark) \
.tableName("<catalog-name>.<schema-name>.<table-name>") \
.addColumn("<column-name>", "<data-type>") \
.property("<key>", "<value>") \
.execute()
创建托管的 Apache Iceberg 表:
from pyspark.sql.types import StructType, StructField, StringType
schema = StructType([StructField("<column-name>", StringType())])
spark.createDataFrame([], schema).write \
.format("iceberg") \
.saveAsTable("<catalog-name>.<schema-name>.<table-name>")
为了保持读取和写入的性能,Azure Databricks定期运行操作以优化托管的 Apache Iceberg 表元数据。 此任务使用对 Apache Iceberg 表具有 MODIFY 权限的无服务器计算执行。 此操作仅写入表的元数据,并且计算过程仅在任务期间维护对该表的权限。
Note
若要创建 Apache Iceberg 表,请显式指定 USING iceberg。 否则,Azure Databricks 默认创建 Delta Lake 表。
你可以根据查询结果或 DataFrame 写入操作创建托管表。 以下文章演示了可用于在 Azure Databricks 上创建托管表的一些模式:
若要创建现有托管表的副本,请使用克隆。 托管 Delta Lake 表支持深度克隆和浅层克隆。 托管 Apache Iceberg 表仅支持深度克隆。 请参阅在 Azure Databricks 上克隆表和克隆托管 Iceberg 表。
删除托管表
若要删除托管表,你必须具备:
- 表的
MANAGE权限,或者你必须是表的所有者。 - 对表父架构的
USE SCHEMA权限。 - 对表父级目录的
USE CATALOG特权。
若要删除托管表,请运行以下命令:
SQL
DROP TABLE IF EXISTS catalog_name.schema_name.table_name;
Python
spark.sql("DROP TABLE IF EXISTS catalog_name.schema_name.table_name")
或者,在 Databricks Runtime 18.2 及更高版本中,使用 spark.catalog.dropTable():
spark.catalog.dropTable("catalog_name.schema_name.table_name", ifExists=True)
Unity Catalog 支持使用 UNDROP TABLE 命令恢复误删的托管表。 默认情况下,表在删除后可恢复 7 天。 恢复期结束后,Azure Databricks在 48 小时内从云租户中删除基础数据文件。
配置恢复期
Important
可配置的恢复期为 公共预览版。
您可以在目录或架构级别配置已删除的托管表保持可恢复状态的时长。 如果在两个级别设置恢复期,则架构级设置优先于该架构中的表。
若要配置恢复期,必须在目录或架构上拥有 MANAGE 特权或所有权。 此设置仅适用于配置后删除的表。 它不会影响已经被删除的表。
恢复期可设置为 0 小时(以禁用恢复)或 7 至 30 天(含)。 更长的恢复期(最长为 30 天)可增加保护,防止意外删除关键生产数据。 较短的恢复期,或者将其设置为 0,会使被删除的数据更快被清除——这有助于为在 ETL 管道中频繁创建和删除表的工作负载节省成本。 将恢复期设置为 0 表示无法使用删除的表进行恢复 UNDROP。 数据文件在删除表后的 48 小时内从云存储中删除。
若要设置恢复期,请将 ALTER CATALOG 或 ALTER SCHEMA 与 RETAIN DROPPED TO 子句搭配使用:
SQL
-- 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;
Python
spark.sql("ALTER CATALOG my_catalog RETAIN DROPPED TO 30 DAYS")
spark.sql("ALTER SCHEMA my_catalog.my_schema RETAIN DROPPED TO 7 DAYS")
还可以在使用 RETAIN DROPPED FOR 子句创建目录或架构时设置恢复期:
SQL
CREATE CATALOG my_catalog RETAIN DROPPED FOR 30 DAYS;
CREATE SCHEMA my_catalog.my_schema RETAIN DROPPED FOR 7 DAYS;
Python
spark.sql("CREATE CATALOG my_catalog RETAIN DROPPED FOR 30 DAYS")
spark.sql("CREATE SCHEMA my_catalog.my_schema RETAIN DROPPED FOR 7 DAYS")
若要检查当前恢复期,请运行 DESCRIBE EXTENDED。 输出包括一个 Recovery Period Hours 行:
SQL
DESCRIBE CATALOG EXTENDED my_catalog;
DESCRIBE SCHEMA EXTENDED my_catalog.my_schema;
Python
spark.sql("DESCRIBE CATALOG EXTENDED my_catalog").show()
spark.sql("DESCRIBE SCHEMA EXTENDED my_catalog.my_schema").show()