Spark数据帧保存到具有自动增量列的SQL表

Tom*_*mer 1 jdbc apache-spark apache-spark-sql

我在数据库中有下表

+----------------+------------+------+-----+---------+----------------+
| Field          | Type       | Null | Key | Default | Extra          |
+----------------+------------+------+-----+---------+----------------+
| id             | bigint(20) | NO   | PRI | NULL    | auto_increment |
| VERSION        | bigint(20) | NO   |     | NULL    |                |
| user_id        | bigint(20) | NO   | MUL | NULL    |                |
| measurement_id | bigint(20) | NO   | MUL | NULL    |                |
| day            | timestamp  | NO   |     | NULL    |                |
| hour           | tinyint(4) | NO   |     | NULL    |                |
| hour_timestamp | timestamp  | NO   |     | NULL    |                |
| value          | bigint(20) | NO   |     | NULL    |                |
+----------------+------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)

我正在尝试保存包含具有以下案例类结构的多行的 Spark 数据框:

case class Record(val id : Int,
                  val VERSION : Int,
                  val user_id : Int,
                  val measurement_id : Int,
                  val day : Timestamp,
                  val hour : Int,
                  val hour_timestamp : Timestamp,
                  val value : Long  )
Run Code Online (Sandbox Code Playgroud)

当我尝试使用 jdbc 驱动程序将数据帧保存到我的 sql 时:

dataFrame.insertIntoJDBC(...)
Run Code Online (Sandbox Code Playgroud)

我收到主键违规错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'PRIMARY'
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
Run Code Online (Sandbox Code Playgroud)

我尝试将 id=0 设置为所有行的默认值,并尝试从案例类中删除 id 字段,但都不起作用。

有人可以帮忙吗?

谢谢,托默

Tom*_*mer 5

找到了。我遇到了 sql <-> java 列类型问题。根据:https: //www.cis.upenn.edu/~bcpierce/courses/629/jdkdocs/guide/jdbc/getstart/mapping.doc.html

bigint sql 列在 java 中应表示为 Long。在我将案例类别更改为:

case class Record(val id: Long,
                  val VERSION : Long,
                  val user_id : Long,
                  val measurement_id : Long,
                  val day : Timestamp,
                  val hour : Int,
                  val hour_timestamp : Timestamp,
                  val value : Long  )
Run Code Online (Sandbox Code Playgroud)

并为其工作的数据框中的所有记录设置 id=0 。谢谢