Azure Databricks 支持 SQL 标准 DDL 命令,用于删除和替换已注册到 Unity Catalog 或 Hive 元存储的表。 删除和替换行为因表类型和元存储而异。 选择正确的命令以避免数据丢失或并发操作失败。
何时删除表
Databricks 建议,在您想要永久删除某个表且无意在同一位置创建新表时,使用 DROP TABLE 将该表从元存储中移除。 例如:
DROP TABLE table_name
DROP TABLE 具有不同的行为,具体取决于表的类型以及表是注册到 Unity 目录还是旧版 Hive 元存储。
| 表类型 | 元数据仓库 | Behavior |
|---|---|---|
| Managed | 统一目录 | 表已从元存储中删除,基础数据被标记为要删除。 您可以在配置的恢复期内(默认 7 天)UNDROP 托管表。 请参阅 “删除托管表”。 |
| Managed | Hive | 已从元数据存储中删除表,并删除了其基础数据。 |
| External | 统一目录 | 已从元存储中删除表,但保留基础数据。 URI 访问权限现在受包含数据的外部位置的约束。 |
| External | Hive | 已从元存储中删除表,但保留基础数据。 所有 URI 访问权限都保持不变。 |
Unity Catalog 使用内部表 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 都具有相同的语义。 以下是 CREATE OR REPLACE TABLE 的重要优势:
- 替换表内容,但会保留表标识。
- 会保留表历史记录,并且可以使用
RESTORE命令将表还原到早期版本。 - 该操作是单个事务,因此不会出现表不存在的情况。
- 从表读取的并发查询可以不间断继续。 由于替换前后的版本仍存在于表历史记录中,并发查询可以根据需要引用表的任一版本。
- 如果原始表包含列掩码,这些掩码将保留为新表中仍然存在的任何列。 这可确保保留数据访问策略。
请参阅 CREATE TABLE [USING]。
使用并发操作替换数据
如果要在可能用于并发操作的表中执行完全替换数据,则必须使用 CREATE OR REPLACE TABLE。
不应使用以下反模式:
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`
由于原子替换会保留表的历史记录,因此并发事务可以验证其所引用源表的版本,并在不出现意外行为的情况下,对并发事务进行失败处理或协调。