重要
此功能目前以公共预览版提供。
重要
对于 Unity Catalog 管理的表和外部表,浅克隆支持有所不同。 对于托管表,请使用 Databricks Runtime 13.3 及更高版本,对于外部表,请使用 Databricks Runtime 14.2 及更高版本。
只能将 Unity Catalog 托管表克隆到 Unity Catalog 托管表,Unity Catalog 外部表克隆到 Unity Catalog 外部表。 托管表和外部表的 VACUUM 行为不同。 请参阅“与 Unity 目录浅表克隆一起使用VACUUM”。
可以使用浅克隆技术从现有的 Unity Catalog 表创建新的 Unity Catalog 表。 借助对 Unity Catalog 的浅表克隆支持,可以创建具有独立于其父级表的访问控制权限的表,且无需复制基础数据文件。
有关克隆表的信息,请参阅 在 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 |
与其他创建表语句一样,创建浅表克隆的用户拥有目标表。 克隆目标表的所有者可以独立于源表控制该目标表的访问权限。 这意味着克隆表的所有者可能与源表的所有者不同。
创建 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 |
在标准访问模式下使用浅克隆表格
若要在标准访问模式(以前称为共享访问模式)中查询浅层克隆,必须对表及相关资源拥有以下权限。
| 资源 | 所需的权限 |
|---|---|
| 目录 | USE CATALOG |
| 架构 | USE SCHEMA |
| 表 | SELECT |
还必须对克隆操作的目标具有 MODIFY 权限才能完成以下操作。
- 插入记录
- 删除记录
- 更新记录
MERGECREATE TABLEDROP TABLE
在专用访问模式下使用浅克隆表
在专用访问模式(以前是单用户访问模式)中使用 Unity 目录浅表克隆时,必须对克隆的表源和目标表的资源拥有权限。
这意味着,除了目标表所需的权限之外,对于简单查询,您还必须具有USE源目录和架构的权限以及SELECT源表的权限。 对于任何要将记录更新或插入至目标表的查询,还必须对源表具有 MODIFY 权限。
Databricks 建议使用标准访问模式在计算上使用 Unity 目录克隆,因为这样就可以独立演变 Unity 目录浅表克隆目标及其源表的权限。
与 Unity Catalog 浅克隆配合使用VACUUM
将 Unity Catalog 表用于浅表克隆操作的源和目标时,Unity Catalog 会管理基础数据文件,以提高克隆操作的源和目标的可靠性。 在浅克隆的源上运行 VACUUM 不会破坏克隆的表。
通常,当 VACUUM 标识给定保留阈值的有效文件时,仅考虑当前表的元数据。 但是,Unity Catalog 的浅克隆功能支持跟踪所有克隆表与源数据文件之间的关系,因此将扩展有效文件以包括返回任何浅克隆表以及源表查询所需的数据文件。
这意味着,对于 Unity Catalog 浅克隆 VACUUM 语义,有效的数据文件是源表或任何克隆表的指定保留阈值内的任何文件。 托管表和外部表的语义略有不同。
对元数据的增强型跟踪更改了VACUUM操作对Delta表基础数据文件的影响,并体现出以下语义。
- 对于托管表,针对浅表克隆操作的源或目标的
VACUUM操作可能会从源表中删除数据文件。 - 对于外部表,
VACUUM操作仅在针对源表运行时从源表中移除数据文件。 - 只有未被视为源表有效的数据文件或与源相关的任何浅层克隆会被删除。
- 如果针对单个源表定义了多个浅克隆,则对任何克隆表运行
VACUUM不会删除其他克隆表的有效数据文件。
注意
Databricks 建议不要在设置保留期少于 7 天的情况下运行 VACUUM,以避免对长时间运行事务造成损坏。 如果需要以较低的保留阈值运行 VACUUM,请确保了解 Unity Catalog 中浅克隆上的 VACUUM 与 VACUUM 和 Azure Databricks 上的其他克隆表的交互方式有何不同。 有关详细信息,请参阅 在 Azure Databricks 上克隆表。
此外,即使删除了浅克隆表,也可能需要 SELECT 访问该浅克隆表才能在基表上运行 VACUUM 。 Databricks 读取浅表克隆的 Delta 日志,以验证克隆仍引用的基表数据文件,然后再清理这些文件。 Databricks 在浅克隆表被删除后,将保留此链接 7 天,以支持该UNDROP操作。 但是,在标准访问模式下,不需要此权限。
删除浅克隆的基表
如果删除浅表克隆的基表,则克隆将不可用。 默认情况下,如果基表仍有浅克隆引用它,Databricks 将阻止删除该基表。
若要替代此保护,请使用 DROP TABLE ... FORCE 语法。 如果使用 FORCE:
- 立即删除基表表格。
- 所有引用浅克隆的地方都会损坏,并且会发生如下情况:
- 在需要读取数据或元数据的操作(例如,
SELECT、INSERT、UPDATE、DESCRIBE HISTORY、CLONE)时失败。 - 仍然可以通过元数据级操作(例如,
SHOW TABLES,DROP TABLE)看到,从而允许清理。
- 在需要读取数据或元数据的操作(例如,
此行为仅适用于 Unity 目录托管表。 有关详细信息,请参阅 DROP TABLE。
限制
- 外部表上的浅表克隆必须是外部表。 托管表上的浅表克隆必须是托管表。
- 不能使用
REPLACE或CREATE OR REPLACE覆盖掉现有的浅克隆。 而是对DROP进行浅表克隆,并运行新的CREATE语句。 - 不能通过 Delta Sharing 共享浅层克隆。
- 不能嵌套浅表克隆,也就是说,不能从一个浅表克隆创建另一个浅表克隆。
- 对于托管表,删除源表会导致浅层克隆的目标表失效。 外部表的基础数据文件不会通过
DROP TABLE操作删除,因此外部表的浅表克隆不会因删除源而受到影响。 - Unity Catalog 允许用户在
UNDROP命令后DROP TABLE托管表约 7 天。 在 Databricks Runtime 13.3 LTS 及更高版本中,已删除源表的托管浅表克隆在 Unity 目录支持的UNDROP7 天内继续工作。 如果未在该窗口中还原源表,则浅表克隆会在垃圾回收期间删除源数据文件时停止运行。