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 文件