我有一个PySpark代码,可以像这样写入SQL Server数据库
df.write.jdbc(url=url, table="AdventureWorks2012.dbo.people", properties=properties)
然而问题是我想继续写表人,即使表存在,我在Spark文档中看到有可能的选项错误,追加,覆盖和忽略模式,所有这些都抛出错误,如果表已存在于数据库中,则对象已存在。
火花抛出跟随错误 py4j.protocol.Py4JJavaError:调用o43.jdbc时发生错误。 com.microsoft.sqlserver.jdbc.SQLServerException:已经存在一个名为' people'的对象。在数据库中
即使表已经退出,有没有办法将数据写入表中? 请告诉我您需要更多解释
答案 0 :(得分:1)
对我来说,问题出在Spark 1.5.2上。它检查表是否存在(here)的方法是运行SELECT 1 FROM $table LIMIT 1
。如果查询失败,则表格不存在。即使桌子在那里,该查询也会失败。
在1.6.0(here)中将其更改为SELECT * FROM $table WHERE 1=0
。
答案 1 :(得分:0)
因此append
和overwrite
模式在表已存在时不会抛出错误。从spark文档(http://spark.apache.org/docs/latest/sql-programming-guide.html#save-modes)SaveMode.Append
将"将DataFrame保存到数据源时,如果数据/表已经存在,则DataFrame的内容应该附加到现有数据。 "并且SaveMode.Overwrite
将"覆盖模式意味着在将DataFrame保存到数据源时,如果数据/表已经存在,则预期现有数据将被DataFrame的内容覆盖。"根据您希望如何处理现有表格,这两者中的一个应该可能满足您的需求。