【问题标题】:Databricks - is not empty but it's not a Delta tableDatabricks - 不为空,但不是 Delta 表
【发布时间】:2021-10-13 07:51:08
【问题描述】:

我在 Databricks 上运行查询:

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

我试图了解为什么会收到以下错误:

SQL 语句出错:AnalysisException:无法创建表 ('default.dublicates_hotels')。关联的位置('dbfs:/user/hive/warehouse/dubblicates_hotels')不为空,但不是 Delta 表

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

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

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

谁能帮我理解一下?

【问题讨论】:

    标签: apache-spark-sql databricks delta-lake


    【解决方案1】:

    DROP TABLE & CREATE TABLE 与 Metastore 中的条目一起工作,Metastore 是某种数据库,用于保存有关数据库和表的元数据。当 Metastore 中的条目不存在时,可能会出现这种情况,因此 DROP TABLE IF EXISTS 不做任何事情。但是当CREATE TABLE 被执行时,它会额外检查DBFS 上的位置,如果目录存在(可能有数据)则失败。这个目录可能是在之前的一些实验中留下的,当时数据是在不使用元存储的情况下写入的。

    【讨论】:

      【解决方案2】:

      如果创建的表指定了 LOCATION - 这意味着该表是外部的,因此当您删除它时 - 您只删除该表的配置单元元数据,目录内容保持原样。如果指定相同的 LOCATION,则可以通过 CREATE TABLE 恢复表(Delta 将表结构与目录中的数据一起保留)。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2020-11-04
          • 1970-01-01
          • 2022-11-05
          • 2021-09-29
          • 2019-05-14
          • 1970-01-01
          • 2021-09-02
          • 1970-01-01
          • 2022-10-16
          相关资源
          最近更新 更多