适用于 Unity Catalog 表的浅表克隆

Important

此功能目前以公共预览版提供。

Important

对于 Unity Catalog 管理的表和外部表,浅克隆支持有所不同。 对于托管表,请使用 Databricks Runtime 13.3 LTS 及更高版本,对于外部表,请使用 Databricks Runtime 14.3 LTS 及更高版本。

只能将 Unity Catalog 托管表克隆到 Unity Catalog 托管表,Unity Catalog 外部表克隆到 Unity Catalog 外部表。 托管表和外部表的 VACUUM 行为不同。 请参阅“与 Unity 目录浅表克隆一起使用VACUUM”。

使用浅表克隆创建具有独立于其源表的访问控制权限的 Unity 目录表,而无需复制基础数据文件。 Unity Catalog 仅支持 Delta Lake 表的浅克隆。 无法创建 Iceberg 或其他非 Delta 表的浅表克隆。

有关克隆表的信息,请参阅 在 Azure Databricks 上克隆表。

创建 Unity Catalog 托管的浅表克隆

在 Unity Catalog 中创建一个托管表的浅表克隆。

CREATE TABLE <catalog-name>.<schema-name>.<target-table-name>
SHALLOW CLONE <catalog-name>.<schema-name>.<source-table-name>

若要在 Unity Catalog 中创建一个受管理的浅表克隆,您必须在源资源和目标资源上拥有以下权限。

资源 所需权限
源架构 USE SCHEMA
源目录 USE CATALOG
目标架构 USE SCHEMA、CREATE TABLE
目标目录 USE CATALOG

与其他创建表语句一样,运行 SHALLOW CLONE时,你拥有目标表。 克隆目标表的所有者可以独立于源表控制该目标表的访问权限。 克隆表的所有者可能与源表的所有者不同。

创建 Unity Catalog 外部浅层克隆

通过指定外部位置创建 Unity 目录外部浅表克隆。

CREATE TABLE <catalog-name>.<schema-name>.<target-table-name>
SHALLOW CLONE <catalog-name>.<schema-name>.<source-table-name>
LOCATION 's3://<bucket-name>/<path-name>/<target-table-name>'

若要在 Unity 目录中创建外部浅表克隆,必须在源资源和目标资源上拥有以下权限。

资源 所需权限
源架构 USE SCHEMA
源目录 USE CATALOG
目标架构 USE SCHEMA、CREATE TABLE
目标目录 USE CATALOG
目标外部位置 CREATE EXTERNAL TABLE

在标准访问模式下处理浅克隆表的操作

若要在标准访问模式(以前称为共享访问模式)下查询浅克隆,您必须对该表及其所属资源具有以下权限:

资源 所需权限
Catalog USE CATALOG
Schema USE SCHEMA
Table SELECT

还必须对克隆操作的目标具有 MODIFY 权限才能运行以下操作:

  • INSERT
  • DELETE
  • UPDATE
  • MERGE
  • CREATE TABLE
  • DROP TABLE

在专用访问模式下使用浅层克隆表

在专用访问模式(以前是单用户访问模式)中使用 Unity 目录浅表克隆时,必须对克隆表源和目标表的资源拥有权限。

对于简单查询,除了对目标表所需的权限外,您还必须具有对源目录和架构的USE权限,以及对源表的SELECT权限。 对于更新或插入目标表记录的任何查询,还必须对源表具有 MODIFY 权限。

Databricks 建议在具有标准访问模式的计算上使用 Unity 目录克隆,因为这样就可以对 Unity 目录浅表克隆目标及其源表的权限进行独立更改。

与 Unity 目录浅表克隆配合使用VACUUM

将 Unity Catalog 表用于浅表克隆操作的源和目标时,Unity Catalog 会管理基础数据文件,以提高克隆操作的源和目标的可靠性。 对浅克隆的源运行 VACUUM 不会损坏克隆的表。

通常,当 VACUUM 标识给定保留阈值的有效文件时,仅考虑当前表的元数据。 但是,Unity Catalog 对浅克隆的支持会跟踪所有克隆表与源数据文件之间的关系,因此有效文件的范围会扩展为包括为浅克隆表和源表返回查询结果所需的数据文件。

对于 Unity Catalog 浅克隆中的 VACUUM,有效的数据文件是指位于针对源表或任意克隆表所指定保留阈值范围内的任何文件。 托管表和外部表的行为略有不同。

这种增强后的元数据跟踪方式改变了 VACUUM 操作对 Delta Lake 表底层数据文件的影响方式,具体表现如下:

  • 对于托管表,对浅克隆操作的源或目标执行 VACUUM 操作,可能会删除源表中的数据文件。
  • 对于外部表,VACUUM 操作仅在针对源表运行时从源表中移除数据文件。
  • 只有被视为对源表无效的数据文件或对源表的任意浅层克隆才会被删除。
  • 如果针对单个源表定义了多个浅克隆,则对任何克隆表运行 VACUUM 不会删除其他克隆表的有效数据文件。

注释

Databricks 建议您切勿在保留期设置少于 7 天的情况下运行 VACUUM,以避免破坏正在进行的长时间运行事务。 如果您需要较低的保留阈值,请考虑 VACUUM 对 Unity Catalog 中浅克隆的作用方式与 VACUUM 对 Azure Databricks 上其他克隆表的影响方式有何不同。 有关详细信息,请参阅 在 Azure Databricks 上克隆表。

即使删除了浅表克隆表,也可能需要 SELECT 访问该浅克隆表才能在基表上运行 VACUUM 。 Databricks 读取浅表克隆的 Delta 日志,以验证克隆仍引用的基表数据文件,然后再清理这些文件。 Databricks 在删除浅克隆表后,会保留此链接 7 天,以支持 UNDROP 操作。 但是,在标准访问模式下,不需要此权限。

删除浅克隆所用的基表

即使活跃的浅克隆仍然引用 Unity 目录管理的表,你也可以丢弃它的基础表。 克隆会一直读取,直到基础表的数据文件被删除,这时它们就无法使用。 你可以在其恢复期内使用 UNDROP 恢复基础表。恢复期默认值为 7 天,并且可在目录级别或架构级别设置为 0(禁用恢复)或 7 至 30 天。 恢复期的配置处于 公开预览阶段。 如果你不恢复表,异步清除过程会在恢复期结束后删除数据文件,这样克隆体可以在基础表无法恢复后继续读取一段时间。 要恢复丢失的基表,请使用 UNDROP。

注释

某些工作区会对具有浅克隆的基表实施删除时保护。 如果对此类基表执行 DROP TABLE 时因出现 CANNOT_DROP_BASE_TABLE_REFERENCED_BY_SHALLOW_CLONE 错误而失败,则说明你的工作区实施了这种保护机制。 如果仍要删除基表,请使用 DROP TABLE ... FORCE。 删除带有 FORCE 的基表会导致引用该基表的浅克隆失效。 这些克隆在读取数据或元数据的操作中会失败(例如,SELECT、UPDATE、INSERT、DESCRIBE HISTORY、CLONE),但对于元数据级操作(例如,SHOW TABLES、DROP TABLE)仍然可见,以便你将其清理掉。 此保护仅适用于Unity Catalog管理的表。

Limitations

  • 仅 Delta Lake 表支持浅克隆。 无法创建 Iceberg 或其他非 Delta 表的浅表克隆。
  • 你不能使用 CREATE OR REPLACE 覆盖现有的浅克隆。 使用 DROP TABLE 后接 CREATE TABLE,或使用新表名。
  • 外部表上的浅表克隆必须是外部表。 在托管表上进行的浅克隆操作必须属于托管表。
  • 您无法使用 OpenSharing 共享浅克隆。
  • 不能嵌套浅表克隆,也就是说,不能从一个浅表克隆创建另一个浅表克隆。
  • 对于外部表,DROP TABLE 不会删除底层数据文件,因此在删除源表时,浅层克隆不会受到影响。
  • 对于 Databricks Runtime 13.3 LTS 及更高版本中的托管表,即使源表已被删除,其浅克隆仍可正常工作,直到源数据文件被删除。 请参阅 删除浅表克隆的基表。