JDBC 写入失败,出现 PrimaryKeyViolation 错误

问题

你使用 JDBC 写入具有主键约束的 SQL 表,而作业失败并出现 PrimaryKeyViolation 错误。

或者,还可以使用 JDBC 写入不具有主键约束的 SQL 表,在最近编写的表中会看到重复项。

原因

Apache Spark 执行 JDBC 写入时,数据帧的一个分区将写入 SQL 表中。 这通常作为单个 JDBC 事务来完成,以避免重复插入数据。 但是,如果事务在提交发生之后、最后阶段完成之前失败,可能会有重复的数据复制到 SQL 表中。

当写入操作试图为主键插入重复项时,将发生 PrimaryKeyViolation 错误。

解决方案

应使用临时表缓冲写入,并确保没有重复的数据。

  1. 验证 Spark 配置中是否禁用了推理执行:spark.speculation false。 此项已默认禁用。
  2. 在 SQL 数据库中创建临时表。
  3. 修改 Spark 代码以写入临时表。
  4. Spark 写入完成后,检查临时表以确保没有重复的数据。
  5. 将临时表与 SQL 数据库上的目标表合并在一起。
  6. 删除临时表。

注意

仅当遇到列出的数据重复问题时才应使用此解决方法,因为与直接写入目标表的 Spark 作业相比,性能会有较小的下降。