Azure Databricks - Can not create the managed table The associated location already exists
我在Azure Databricks中遇到以下问题。有时,当我尝试将DataFrame保存为托管表时:
1 | SomeData_df.write.mode('overwrite').saveAsTable("SomeData") |
我收到以下错误:
"Can not create the managed table('
SomeData '). The associated
location('dbfs:/user/hive/warehouse/somedata') already exists.;"
我曾经通过运行%fs rm命令来删除该位置来解决此问题,但是现在我使用的是由其他用户管理的群集,因此我无法再在该位置上运行rm。
目前我唯一能想到的解决方法是使用其他表名。
使该表更为奇怪的是该表不存在的事实。当我运行时:
1 2 | %sql SELECT * FROM SomeData |
我得到了错误:
Error in SQL statement: AnalysisException: Table or view not found:
SomeData;
我该如何解决?
似乎还有其他一些问题相同。
一个临时的解决方法是使用
1 | dbutils.fs.rm("dbfs:/user/hive/warehouse/SomeData/", true) |
在重新创建表之前将其删除。
通常在写入表时关闭集群时发生。 Databricks文档中推荐的解决方案:
此标志删除_STARTED目录,并使过程返回到原始状态。例如,您可以在笔记本
中进行设置
1 2 | %py spark.conf.set("spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation","true") |
有关上下文的更多答案,请在笔记本中运行:
1 | dbutils.fs.rm("dbfs:/user/hive/warehouse/SomeData", recurse=True) |
根据Databricks的文档,这将在Python或Scala笔记本中运行,但是如果您使用的是R或SQL笔记本,则必须在单元格开头使用魔术命令
此处所有其他推荐的解决方案都是解决方法或不起作用。该模式被指定为覆盖,这意味着您不需要删除或删除数据库或使用旧选项。
相反,尝试在编写表时在选项中指定完全限定的路径:
1 2 3 4 | df.write \\ .option("path","hdfs://cluster_name/path/to/my_db") \\ .mode("overwrite") \\ .saveAsTable("my_db.my_table") |
好吧,发生这种情况是因为您试图以"覆盖"模式将数据写入默认位置(不指定"路径"选项)。
就像迈克说的那样,您可以将" spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation"设置为" true",但是此选项在Spark 3.0.0中已删除。
如果尝试在Spark 3.0.0中设置此选项,则将出现以下异常:
1 | 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.; |
为避免此问题,您可以使用"覆盖"模式显式指定要保存的路径。
我有同样的问题,我正在使用
1 | create table if not exists USING delta |
如果我首先删除建议的文件,它将创建一次,但是第二次问题再次出现,似乎创建表不存在无法识别该表并尝试创建它
我不想每次都删除表,实际上是在尝试使用MERGE保留表。