【问题标题】:spark [dataframe].write.option("mode","overwrite").saveAsTable("foo") fails with 'already exists' if foo existsspark [dataframe].write.option("mode","overwrite").saveAsTable("foo") 如果 foo 存在,则失败并显示“已经存在”
【发布时间】:2019-12-13 13:50:38
【问题描述】:

我认为我在 spark 中看到了一个错误,其中不遵守“覆盖”模式,而是在尝试将 saveAsTable 放入已经存在的表(使用“覆盖”模式)时引发异常。

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

 org.apache.spark.sql.AnalysisException: Table `example` already exists.;

非常感谢任何建议。

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()     

【问题讨论】:

    标签: sql scala apache-spark overwrite


    【解决方案1】:

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

    df3.write.mode(SaveMode.Overwrite).saveAsTable("example")
    

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

    【讨论】:

    • 准确! thnx ;^)
    • 这不起作用。我试过df1.write.mode('overwrite').saveAsTable('policy1')。但我仍然得到同样的错误。无法创建托管表('policy1')。关联的位置('spark-warehouse/policy1')已经存在
    • @DurgaSwaroop 您找到解决方案了吗?我也收到“已经存在”错误
    • 关联的位置已经存在是有点不同的情况,你有没有试过设置spark.conf.set("spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation","true")这里描述-kb.databricks.com/jobs/spark-overwrite-cancel.html
    猜你喜欢
    • 2015-03-21
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 2014-10-08
    • 2014-05-03
    • 1970-01-01
    相关资源
    最近更新 更多