spark dataframe保存到SQL表与自动增量列



我在db

中有以下表
+----------------+------------+------+-----+---------+----------------+
| 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    |                |
+----------------+------------+------+-----+---------+----------------+

我试图保存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  )

当我试图保存数据帧到我的sql通过jdbc驱动程序使用:

dataFrame.insertIntoJDBC(...)

我得到一个主键冲突错误:

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)

我试图将id=0设置为所有行的默认值,并试图从case类中删除id字段,但均未成功。

有人能帮忙吗?

谢谢,托马

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

bigint sql列在java中应该表示为Long。在我将case类更改为:

之后
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  )

并为它工作的数据帧中的所有记录设置id=0。由于

相关内容

  • 没有找到相关文章