我正在尝试使用Spark SQL DataFrames和JDBC连接在MySql上插入和更新一些数据。
我已经成功使用SaveMode.Append插入了新数据。有没有办法从Spark SQL更新MySql表中已经存在的数据?
我要插入的代码是:myDataFrame.write.mode(SaveMode.Append).jdbc(JDBCurl,mySqlTable,connectionProperties)
如果更改为SaveMode.Overwrite,它将删除整个表并创建一个新表,我正在寻找MySql中可用的“ ON DUPLICATE KEY UPDATE”之类的东西。
最佳答案
这不可能。到目前为止(Spark 1.6.0 / 2.2.0 SNAPSHOT)Spark DataFrameWriter
仅支持四种写入模式:
SaveMode.Overwrite
:覆盖现有数据。
SaveMode.Append
:附加数据。
SaveMode.Ignore
:忽略该操作(即无操作)。
SaveMode.ErrorIfExists
:默认选项,在运行时引发异常。
例如,您可以使用mapPartitions
手动插入(因为您希望UPSERT操作应该是幂等且易于实现),写入临时表并手动执行upsert或使用触发器。
通常,要实现批处理操作的upsert行为并保持良好的性能绝非易事。您必须记住,在一般情况下,会有多个并发事务(每个分区一个),因此您必须确保不会发生写冲突(通常通过使用应用程序特定的分区)或提供适当的恢复过程。在实践中,执行和批量写入临时表并直接在数据库中解析加插部分可能会更好。