Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Azure DataRicks-无法创建关联位置已存在的托管表_Apache Spark_Hive_Azure Data Lake_Databricks_Azure Databricks - Fatal编程技术网

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

Apache spark Azure DataRicks-无法创建关联位置已存在的托管表,apache-spark,hive,azure-data-lake,databricks,azure-databricks,Apache Spark,Hive,Azure Data Lake,Databricks,Azure Databricks,我在Azure Databricks中有以下问题。有时,当我尝试将数据帧保存为托管表时: SomeData_df.write.mode('overwrite').saveAsTable("SomeData") 我得到以下错误: 无法创建托管表(“SomeData”)。关联的 位置('dbfs:/user/hive/warehouse/somedata')已存在 我以前通过运行%fs rm命令删除该位置来解决此问题,但现在我使用的群集由其他用户管理,因此我无法再在该位置运行rm 目前,我能想到的

我在Azure Databricks中有以下问题。有时,当我尝试将数据帧保存为托管表时:

SomeData_df.write.mode('overwrite').saveAsTable("SomeData")
我得到以下错误:

无法创建托管表(“
SomeData
”)。关联的 位置('dbfs:/user/hive/warehouse/somedata')已存在

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

目前,我能想到的唯一修复方法是使用不同的表名

更奇怪的是,这个表格并不存在。当我跑步时:

%sql
SELECT * FROM SomeData
我得到一个错误:

SQL语句中出错:AnalysisException:未找到表或视图: 一些数据


我该如何修复它呢?

似乎还有一些其他的问题需要解决

临时解决方法是使用

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

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

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

create table if not exists USING delta
如果我第一次删除lie建议的文件,它会创建一次,但第二次问题重复出现时,create table not exists似乎无法识别该表并尝试创建它


我不想每次都删除该表,实际上我正在尝试在保留该表时使用“合并”。

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

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

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

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

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

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

发生这种情况是因为您试图使用“覆盖”模式将数据写入默认位置(不指定“路径”选项)。 正如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.;

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

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

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

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

在保存之前,您是否可以使用
dbutils.fs.rm(“dbfs:/user/hive/warehouse/Somedata/”,true)
,而不是
%fs rm
?嘿,它起作用了。非常感谢你!当然可以如果你想结束这个问题,我也添加了它作为答案。这个选项在Spark 3.0中被删除,你对问题中报告的上述行为有什么想法吗?