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