我正在尝试使用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行为并保持良好的性能绝非易事。您必须记住,在一般情况下,会有多个并发事务(每个分区一个),因此您必须确保不会发生写冲突(通常通过使用应用程序特定的分区)或提供适当的恢复过程。在实践中,执行和批量写入临时表并直接在数据库中解析加插部分可能会更好。

10-06 02:03