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

q5iwbnjs  于 2021-06-27  发布在  Hive
关注(0)|答案(5)|浏览(397)

我在azuredatabricks中有以下问题。有时,当我尝试将Dataframe保存为托管表时:

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

我得到以下错误:
“无法创建托管表('0)” SomeData '). 关联位置('dbfs:/user/hive/warehouse/somedata')已存在。;“
我以前通过运行%fs rm命令删除该位置来解决此问题,但现在我使用的群集由其他用户管理,我无法再在该位置上运行rm。
目前我能想到的唯一解决办法是使用不同的表名。
更奇怪的是,这个表并不存在。当我跑步时:

%sql
SELECT * FROM SomeData

我得到一个错误:
sql语句中出错:analysisexception:找不到表或视图:somedata;
我该怎么修?

uyto3xhc

uyto3xhc1#

似乎还有其他几个人有同样的问题。
临时解决方法是使用

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

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

zvokhttg

zvokhttg2#

这通常发生在集群在写入表时关闭时。databricks文档中推荐的解决方案:
此标志删除\u启动的目录并将进程返回到原始状态。例如,您可以在笔记本中设置它

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

ghhkc1vu3#

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

create table if not exists USING delta

如果我第一次删除建议的文件,它会创建一次,但第二次问题重复出现时,create table not exists似乎无法识别该表并尝试创建它
我不想每次都删除表,我实际上是在尝试使用merge来保留表。

qv7cva1a

qv7cva1a4#

发生这种情况的原因是,您试图以“overwrite”模式将数据写入默认位置(不指定“path”选项)。正如mike所说,您可以将“spark.sql.legacy.allowCreatingManagedTableUsingNoneEmptyLocation”设置为“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.;

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

ddrv8njm

ddrv8njm5#

要获得更自由的答案,请在笔记本中运行以下命令:

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

根据databricks的文档,这将在python或scala笔记本中工作,但是您必须使用magic命令 %python 如果您使用的是r或sql笔记本,则在单元格的开头。

相关问题