火花数据框保存到带有自动增量列的 SQL 表

Posted

技术标签:

【中文标题】火花数据框保存到带有自动增量列的 SQL 表【英文标题】:spark dataframe save to SQL table with auto increment column 【发布时间】:2016-11-16 22:01:16 【问题描述】:

我在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  )

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

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 设置为所有行的默认值,还尝试从案例类中删除 id 字段,但均未成功。

谁能帮忙?

谢谢, 托默

【问题讨论】:

你确定唯一的重复是第一条记录吗? 【参考方案1】:

找到了。 我有一个 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  )

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

【讨论】:

以上是关于火花数据框保存到带有自动增量列的 SQL 表的主要内容,如果未能解决你的问题,请参考以下文章

什么是数据块火花增量表?他们是不是还存储特定会话的数据以及如何查看这些增量表及其结构

平面文件(orc,csv)比火花中的增量表更有效吗

创建具有自动增量列的表:“”不是有效名称

如何将自动增量 ID 列添加到从 SQL 查询生成的表中? [复制]

SQL Server 唯一的自动增量列在另一列的上下文中

更改增量表中列的数据类型