Databricks - 不为空,但它不是 Delta 表

问题描述 投票:0回答:4

我在 Databricks 上运行查询:

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

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

SQL 语句错误: AnalysisException: 无法创建表 ('

default
.
dublicates_hotels
')。关联位置('dbfs:/user/hive/warehouse/dublicates_hotels')不为空,但它不是 Delta 表

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

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

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

任何人都可以帮助我理解这一点吗?

apache-spark-sql databricks delta-lake
4个回答
11
投票

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


10
投票

DROP TABLE 和 CREATE TABLE 与 Metastore 中的条目一起使用,Metastore 是某种数据库,保存有关数据库和表的元数据。可能存在这样的情况:元存储中的条目不存在,因此

DROP TABLE IF EXISTS
不会执行任何操作。但是,当执行
CREATE TABLE
时,它还会检查 DBFS 上的位置,如果目录存在(可能包含数据),则失败。当不使用元存储写入数据时,这个目录可能是以前的一些实验留下的。


6
投票

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

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


0
投票

我最终使用允许我创建表格的笔记本删除了空目录 -

%rm -r "/dbfs/user/hive/warehouse/schemaname.db/tablename"
© www.soinside.com 2019 - 2024. All rights reserved.