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

时间:2019-03-27 15:04:11

标签: apache-spark hive azure-data-lake databricks azure-databricks

我在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:找不到表或视图:   SomeData;

我该如何解决?

6 个答案:

答案 0 :(得分:3)

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

此标志删除_STARTED目录,并使过程返回到原始状态。例如,您可以在笔记本中设置

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

答案 1 :(得分:1)

似乎还有其他一些same issue

一种临时解决方法是使用

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

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

答案 2 :(得分:1)

有关上下文的更多答案,请在笔记本中运行:

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

对于每个Databricks的documentation,这将在Python或Scala笔记本中运行,但是如果您使用R或R,则必须在单元格的开头使用魔术命令%python。 SQL笔记本。

答案 3 :(得分:0)

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

create table if not exists USING delta

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

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

答案 4 :(得分:0)

好吧,发生这种情况是因为您试图以“覆盖”模式将数据写入默认位置(不指定“路径”选项)。 就像迈克说的那样,您可以将“ 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.;

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

答案 5 :(得分:0)

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

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

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