spark [dataframe].write.option("mode","overwrite").saveAsTable("foo") 如果 foo 存在,则失败并显示“已存在”

Chr*_*ord 7 sql scala overwrite apache-spark

我想我在 spark 中看到了一个错误,其中不遵守“覆盖”模式,而是在尝试将 saveAsTable 执行到已经存在的表中时抛出异常(使用模式“覆盖”)。

下面是一个重现问题的小脚本。最后一条语句导致堆栈跟踪读数:

 org.apache.spark.sql.AnalysisException: Table `example` already exists.;
Run Code Online (Sandbox Code Playgroud)

任何建议非常感谢。

spark.sql("drop table if exists example ").show()
case class Person(first: String, last: String, age: Integer)
val df = List(
    Person("joe", "x", 9),
    Person("fred", "z", 9)).toDF()
df.write.option("mode","overwrite").saveAsTable("example")

val recover1 = spark.read.table("example")
recover1.show()


val df3 = List(
    Person("mouse", "x", 9),
    Person("golf", "z", 9)).toDF()

 df3.write.
    option("mode","overwrite").saveAsTable("example")      

val recover4 = spark.read.table("example")
recover4.show()     
Run Code Online (Sandbox Code Playgroud)

Gel*_*ion 13

saveAsTable不检查额外选项,mode直接使用

df3.write.mode(SaveMode.Overwrite).saveAsTable("example")
Run Code Online (Sandbox Code Playgroud)

或者

df3.write.mode("overwrite").saveAsTable("example")
Run Code Online (Sandbox Code Playgroud)

  • 这是行不通的。我尝试了``df1.write.mode('overwrite').saveAsTable('policy1')```。但我仍然遇到同样的错误。无法创建托管表(“policy1”)。关联位置('spark-warehouse/policy1')已存在 (3认同)
  • 关联位置已存在的情况有点不同,您是否尝试按照此处所述设置 `spark.conf.set("spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation","true")` - https://kb.databricks.com /jobs/spark-overwrite-cancel.html (2认同)