Databricks - 不为空但不是 Delta table

Databricks - is not empty but it's not a Delta table

我 运行 一个关于 Databricks 的查询:

DROP TABLE IF EXISTS dublicates_hotels;
CREATE TABLE IF NOT EXISTS dublicates_hotels
...

我正在尝试了解为什么会收到以下错误:

Error in SQL statement: AnalysisException: Cannot create table ('default.dublicates_hotels'). The associated location ('dbfs:/user/hive/warehouse/dublicates_hotels') is not empty but it's not a Delta table

我已经找到解决方法(通过手动删除):

dbutils.fs.rm('.../dublicates_hotels',recurse=True)

但我不明白为什么它仍然保留table? 尽管我创建了一个新集群(终止了前一个集群)并且我正在 运行 连接这个查询并附加了一个新集群。

谁能帮我理解一下?

DROP TABLE & CREATE TABLE 使用 Metastore 中的条目,Metastore 是一种保存有关数据库和表的元数据的数据库。可能存在 Metastore 中的条目不存在的情况,因此 DROP TABLE IF EXISTS 不执行任何操作。但是当执行 CREATE TABLE 时,它还会检查 DBFS 上的位置,如果目录存在(可能有数据)则失败。这个目录可能是以前的一些实验留下的,当时数据是在不使用 metastore 的情况下写入的。

我也遇到了类似的问题,然后尝试了命令行 CREATE OR REPLACE TABLE 它解决了我的问题。

如果 table 使用指定的位置创建 - 这意味着 table 是外部的,所以当你删除它时 - 你只删除那个 table 的配置单元元数据,目录内容仍然存在事实上。如果您指定相同的位置,则可以通过 CREATE TABLE 恢复 table(Delta 将 table 结构及其数据保存在目录中)。

如果在 table 创建时未指定 LOCATION - 这是一个 MANAGED table,DROP 将破坏元数据和目录内容