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

Posted

技术标签:

【中文标题】Azure Databricks - 无法创建托管表关联的位置已存在【英文标题】:Azure Databricks - Can not create the managed table The associated location already exists 【发布时间】:2019-08-18 05:03:06 【问题描述】:

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

SomeData_df.write.mode('overwrite').saveAsTable("SomeData")

我收到以下错误:

"无法创建托管表('SomeData')。关联的 location('dbfs:/user/hive/warehouse/somedata') 已经存在。;"

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

目前我能想到的唯一解决方法是使用不同的表名。

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

%sql
SELECT * FROM SomeData

我得到错误:

SQL 语句错误:AnalysisException:找不到表或视图: 一些数据;

我该如何解决?

【问题讨论】:

你可以在保存前使用dbutils.fs.rm("dbfs:/user/hive/warehouse/Somedata/", true)而不是%fs rm吗? 嘿,它成功了。非常感谢! 当然可以。如果您想关闭问题,我也将其添加为答案。 【参考方案1】:

似乎还有一些其他人使用same issue。

临时解决方法是使用

dbutils.fs.rm("dbfs:/user/hive/warehouse/SomeData/", true)

在重新创建之前删除表格。

【讨论】:

【参考方案2】:

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

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

%py
spark.conf.set("spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation","true")

【讨论】:

此选项在 Spark 3.0 中被删除,对问题中报告的上述行为有任何想法吗?【参考方案3】:

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

dbutils.fs.rm("dbfs:/user/hive/warehouse/SomeData", recurse=True)

根据 Databricks 的 documentation,这将在 Python 或 Scala 笔记本中工作,但如果您使用的是 R 或 SQL 笔记本,则必须在单元格开头使用魔术命令 %python

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

添加路径解决了我的问题,谢谢布伦丹【参考方案5】:

我有同样的问题,我正在使用

create table if not exists USING delta

如果我第一次删除建议的文件,它会创建一次,但第二次问题重复,似乎创建表不存在无法识别该表并尝试创建它

我不想每次都删除表,我实际上是在尝试使用 MERGE 保留表。

【讨论】:

【参考方案6】:

嗯,这是因为您尝试使用“覆盖”模式将数据写入默认位置(未指定“路径”选项)。 就像 Mike 所说,您可以将“spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation”设置为“true”,但此选项在 Spark 3.0.0 中已删除。 如果您尝试在 Spark 3.0.0 中设置此选项,您将收到以下异常:

Caused by: org.apache.spark.sql.AnalysisException: The SQL config 'spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation' was removed in the version 3.0.0. It was removed to prevent loosing of users data for non-default value.;

为避免此问题,您可以使用“覆盖”模式明确指定要保存的路径。

【讨论】:

以上是关于Azure Databricks - 无法创建托管表关联的位置已存在的主要内容,如果未能解决你的问题,请参考以下文章

使用 ARM 模板创建 Azure Databricks 令牌

Azure Databricks Notebook 在包中时无法找到“dbutils”

Databricks Connect:无法连接到 azure 上的远程集群,命令:“databricks-connect test”停止

无法使用 Databricks 列出 Azure Storage Gen 2 文件

Azure:在为 azure 创建新的联合国托管磁盘时无法指定存储帐户。

Azure Data PlatformETL工具(20)——创建Azure Databricks