apache spark sql表覆盖问题

Posted

技术标签:

【中文标题】apache spark sql表覆盖问题【英文标题】:apache spark sql table overwrite issue 【发布时间】:2020-12-29 09:36:22 【问题描述】:

我正在使用以下代码从 databricks 中的数据框创建表并遇到错误。

df.write.saveAsTable("newtable")

这在第一次时效果很好,但是如果我要像下面这样重写的话,可以重用性

df.write.mode(SaveMode.Overwrite).saveAsTable("newtable")

我收到以下错误。

错误信息:

org.apache.spark.sql.AnalysisException: Can not create the managed table newtable. The associated location dbfs:/user/hive/warehouse/newtable already exists

【问题讨论】:

【参考方案1】: What are the differences between saveAsTable and insertInto in different SaveMode(s)?

运行以下命令修复问题:

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

或者

设置标志

spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation = true

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

【讨论】:

嗨@vaquar khan,感谢您的回复。我仍然收到错误,不知道为什么不能使用 saveAsTable 进行覆盖。此外,databricks 文档建议不要在大型​​数据集上使用 dbutils.fs.rm。(kb.databricks.com/data/list-delete-files-faster.html) 试试这个。将标志 spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation 设置为 true【参考方案2】:

SQL 配置“spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation”已在版本 3.0.0 中删除。它已被删除以防止丢失非默认值的用户数据。

【讨论】:

以上是关于apache spark sql表覆盖问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 Apache Spark Notebook 覆盖 Bluemix 对象存储中的 Parquet 文件

外部覆盖后 Spark 和 Hive 表架构不同步

如何在 spark scala 中覆盖特定的表分区

使用 Glue 连接和 spark scala 覆盖 Mysql 表

Spark 是不是支持插入覆盖静态分区?

为 impala 表无缝覆盖底层 parquet 数据