Databricks中Spark 3.5.0执行DROP TABLE PURGE报错及数据删除问题
问题描述
在Databricks环境中使用Spark 3.5.0操作现有Delta表时,执行SQL语句%sql DROP TABLE mytable PURGE会抛出SparkUnsupportedOperationException异常;但去掉PURGE的语句%sql DROP TABLE mytable可正常执行,不过此时Azure存储中的数据仍留存。期望删除表时同时删除数据却无法实现,现咨询:
- 报错原因是什么?
- 如何单独删除Azure存储上的对应数据?
问题解答
1. 报错原因
DROP TABLE ... PURGE是Databricks SQL专属的语法扩展,开源Spark 3.5.0配套的Delta Lake库并未实现该语法逻辑,因此执行时会抛出SparkUnsupportedOperationException。
另外补充:即便在支持该语法的Databricks Runtime环境中,也只有**托管表(Managed Table)**执行DROP TABLE ... PURGE时会同时删除元数据和存储数据;如果是外部表,加PURGE也只会删除元数据,不会清理存储数据。
2. 单独删除Azure存储上的对应数据
方法一:使用Databricks dbutils工具
先通过%sql DESCRIBE EXTENDED mytable查询表的存储路径(查看Location字段),再用dbutils递归删除路径下所有内容:
dbutils.fs.rm("/path/to/your/delta/table", recurse=True)
方法二:使用Azure官方工具
- Azure CLI:执行批量删除命令(替换占位符为你的存储信息):
az storage blob delete-batch --account-name <你的存储账户名> --source <容器名> --pattern "delta/table/path/*" - Azure Portal:直接进入对应存储账户的容器,找到表的存储路径手动删除所有文件。
方法三:使用Delta Lake的VACUUM命令(清理全量历史数据)
如果需要彻底清理表的所有数据文件(包括历史版本),可先开启表的真空权限,再执行清理:
ALTER TABLE mytable SET TBLPROPERTIES (delta.enableVacuumWithRetentionDurationCheck = true); VACUUM mytable RETAIN 0 HOURS;
内容的提问来源于stack exchange,提问作者ascripter
相关产品推荐
相关产品推荐

