删除或替换 Delta 表
Azure Databricks 支持 SQL 标准 DDL 命令,用于删除和替换已注册到 Unity Catalog 或 Hive 元存储的表。 本文提供删除和替换 Delta 表的示例,并根据配置的环境和所需结果提供语法建议。
何时删除表
如果要永久删除表,且不想在同一位置创建新表,则应使用 DROP TABLE
从元存储中删除表。 例如:
DROP TABLE table_name
取决于表的类型以及该表是注册到 Unity Catalog 还是旧版 Hive 元存储,DROP TABLE
的语义会有所不同。
表类型 | 元存储 | 行为 |
---|---|---|
托管 | Unity Catalog | 表已从元存储中删除,基础数据被标记为要删除。 可以在 Unity Catalog 托管表中 UNDROP 数据 7 天。 |
托管 | 配置单元 | 已从元存储中删除表并删除基础数据。 |
外部 | Unity Catalog | 已从元存储中删除表,但保留基础数据。 URI 访问权限现在受包含数据的外部位置的约束。 |
外部 | 配置单元 | 已从元存储中删除表,但保留基础数据。 所有 URI 访问权限都保持不变。 |
DROP TABLE
语义因表类型而异,Unity Catalog 使用内部表 ID 维护 Delta 表的历史记录。 但是所有表的结果相同,即操作完成后,以前注册的表名不再具有指向元存储中数据和表历史记录的活动链接。
请参阅 DROP TABLE。
注意
Databricks 不建议在生产管道或系统中先删除表再使用相同的名称重新创建表,因为此模式可能会导致并发操作出现意外结果。 请参阅用并发操作替换数据。
何时替换表
在想要使用新数据完全覆盖目标表的用例中,Databricks 建议使用 CREATE OR REPLACE TABLE
语句。 例如,若要使用 Parquet 目录中的所有数据覆盖 Delta 表,可以运行以下命令:
CREATE OR REPLACE TABLE table_name
AS SELECT * FROM parquet.`/path/to/files`
无论使用何种表类型或元存储,CREATE OR REPLACE TABLE
都具有相同的语义。 以下是 CREATE OR REPLACE TABLE
的重要优势:
- 替换表内容,但会保留表标识。
- 会保留表历史记录,并且可以使用
RESTORE
命令将表还原到早期版本。 - 该操作是单个事务,因此不会出现表不存在的情况。
- 从表读取的并发查询可以不间断继续。 由于替换前后的版本仍存在于表历史记录中,并发查询可以根据需要引用表的任一版本。
请参阅 CREATE TABLE [USING]。
使用并发操作替换数据
当你想要在可能用于并发操作的表中完全替换数据时,必须使用 CREATE OR REPLACE TABLE
。
不应使用以下反模式:
-- This is an anti-pattern. Avoid doing this!
DROP TABLE IF EXISTS table_name;
CREATE TABLE table_name
AS SELECT * FROM parquet.`/path/to/files`;
提出此建议的原因因使用的是托管表还是外部表以及是否使用 Unity Catalog 而异,但在所有 Delta 表类型中,使用这种模式可能会导致错误、记录删除或结果损坏。
相反,Databricks 建议始终使用 CREATE OR REPLACE TABLE
,如以下示例所示:
CREATE OR REPLACE TABLE table_name
AS SELECT * FROM parquet.`/path/to/files`
由于在原子数据替换期间会维护表历史记录,并发事务可以验证引用的源表的版本,从而放弃或协调并发事务,而无需引入意外行为或结果。