Azure Databricks-无法创建托管表关联的位置已存在

Bua*_*aXD 5 hive apache-spark azure-data-lake databricks azure-databricks

我在Azure Databricks中遇到以下问题。有时,当我尝试将DataFrame保存为托管表时:

SomeData_df.write.mode('overwrite').saveAsTable("SomeData")
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

“无法创建托管表(' SomeData')。关联的位置('dbfs:/ user / hive / warehouse / somedata')已存在。”

我曾经通过运行%fs rm命令来删除该位置来解决此问题,但现在我使用的是由其他用户管理的群集,因此我无法再在该位置上运行rm。

目前,我能想到的唯一解决方法是使用其他表名。

使事情变得更加奇怪的是表不存在的事实。当我跑步时:

%sql
SELECT * FROM SomeData
Run Code Online (Sandbox Code Playgroud)

我收到错误:

SQL语句中的错误:AnalysisException:找不到表或视图:SomeData;

我该如何解决?

Bre*_*dan 10

这里推荐的所有其他解决方案要么是解决方法,要么不起作用。该模式被指定为覆盖,这意味着您不需要删除或删除数据库或使用旧选项。

相反,请尝试在写入表时在选项中指定完全限定路径:

df.write \
    .option("path", "hdfs://cluster_name/path/to/my_db") \
    .mode("overwrite") \
    .saveAsTable("my_db.my_table")
Run Code Online (Sandbox Code Playgroud)

  • 添加路径解决了我的问题,谢谢 Brendan (3认同)

cha*_*har 6

似乎还有其他一些问题相同

暂时的解决方法是使用

dbutils.fs.rm("dbfs:/user/hive/warehouse/SomeData/", true)
Run Code Online (Sandbox Code Playgroud)

在重新创建表之前将其删除。


小智 6

这通常发生在集群在写表时关闭。Databricks 文档中推荐的解决方案:

此标志删除 _STARTED 目录并将进程返回到原始状态。比如你可以在notebook中设置

%py
spark.conf.set("spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation","true")
Run Code Online (Sandbox Code Playgroud)


Dav*_*dox 5

要获得更上下文无关的答案,请在笔记本中运行以下命令:

dbutils.fs.rm("dbfs:/user/hive/warehouse/SomeData", recurse=True)
Run Code Online (Sandbox Code Playgroud)

根据 Databricks 的文档,这适用于 Python 或 Scala 笔记本,但如果您使用的是 R 或 SQL 笔记本,则必须%python在单元格开头使用 magic 命令。