Unity Catalog 托管表是 Azure Databricks 中适用于 Delta Lake 和 Apache Iceberg 的默认且推荐使用的表类型。 Unity 目录管理所有读取、写入、存储和优化责任。 请参阅 将外部或外来 Delta Lake 表转换为 Unity Catalog 托管表。
托管表的数据文件存储在包含它们的架构或目录中。 请参阅 在 Unity 目录中指定托管存储位置。
与 外部 表和 外来 表相比,托管表的存储和查询成本更低,能够自动进行维护和优化,并且外部客户端仍可通过开放 API 访问它们。
可以在Azure Databricks支持的所有语言和产品中使用托管表。 需要某些权限才能创建、更新、删除或查询托管表。 请参阅 Unity 目录中的管理特权。
注释
此页面仅描述 Unity 目录托管表。 有关旧 Hive 元存储中的托管表,请参阅 旧 Hive 元存储中的数据库对象。
Unity Catalog 托管表的优势
Unity 目录托管表优化存储成本和查询速度,并允许与 Delta Lake 和 Apache Iceberg 的第三方工具的互操作性。 为了简化数据管理和性能,这些托管表使用由 AI 提供支持的技术,例如文件大小压缩和智能统计信息收集。
托管表通过允许从 Delta Lake 和 Apache Iceberg 客户端进行访问来支持互操作性。 请参阅使用外部系统来访问 Databricks 数据。
以下功能是 Unity Catalog 托管表特有的,外部表和外部联邦表不具备这些功能:
| 功能 / 特点 | 优点 | 配置 |
|---|---|---|
| 目录提交 | 支持跨表的 多语句事务、更快的查询规划、可强制执行的架构和约束更改,以及来自外部引擎的安全写入。 | 默认情况下已关闭。 若要启用,请设置表属性 delta.feature.catalogManaged。 请参阅 “启用目录提交”。 |
| 多语句事务 | 在一个或多个表上运行多个SQL语句,作为单一原子提交,并带有ACID保证。 所有更改要么一起成功,要么一起回滚。 用于 存储过程 和 SQL脚本。 | 默认情况下已关闭。 要选择交易模式,请参见 交易模式。 |
| 自动液体聚类分析 | 对于具有预测优化的表,当查询模式发生变化以提高性能和降低成本时,自动选择和更新聚类分析键。 | 默认情况下已关闭。 若要配置,请参阅 “启用液体聚类分析”。 |
| 元数据缓存 | 内存缓存事务元数据通过减少对云端事务日志的请求,提升了查询性能。 | 默认启用。 不可配置。 |
| 全文搜索索引 | 使用 search 和 isearch 函数加速文本列的子字符串和关键字查找。 Azure Databricks跳过无法包含匹配行的文件,减少扫描的数据量。 |
默认情况下已关闭。 使用 CREATE SEARCH INDEX.处于测试版。 要求使用 Databricks 运行时 18.2 及以上版本。 |
命令后 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 目录服务(IRC)为 Apache Iceberg 客户端提供对使用 Apache Iceberg 的托管表的读取、写入和创建访问权限,并提供对已启用 Apache Iceberg 读取的 Delta Lake 表的只读访问权限。
这两个 API 都支持凭据派发(c0),该功能提供临时的、特定范围的凭据,这些凭据继承请求主体(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 table using Iceberg
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 优化托管表的元数据。 该任务使用无服务器计算完成,该计算在表上拥有 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;
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 目录支持 UNDROP TABLE 命令来恢复意外删除的托管表。 默认情况下,表在删除后可恢复 7 天。 恢复期结束后,异步清除过程会从你的云租户中删除底层数据文件。
配置恢复期
重要
可配置的恢复期为 公共预览版。
您可以在目录或架构级别配置已删除的托管表保持可恢复状态的时长。 如果在两个级别设置恢复期,则架构级设置优先于该架构中的表。
若要配置恢复期,必须在目录或架构上拥有 MANAGE 特权或所有权。 此设置仅适用于配置后删除的表。 它不会影响已经被删除的表。
恢复期可以是0小时,导致恢复失效,也可以是7到30天。 较长的周期保护关键数据的意外丢失,而较短的时间则能更快地删除掉落的数据,以节省经常创建和丢弃表的ETL管道中的存储成本。 当设置为 0 时,已删除的表无法通过 UNDROP 恢复。 异步清理流程会在删除操作完成后从云存储中删除数据文件。
若要设置恢复期,请将 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()