【发布时间】:2021-02-02 09:23:19
【问题描述】:
我在 java 应用程序中使用 spark,我必须将数据帧保存到现有的 db 表中。数据库是 Sybase。火花版本 3.0.1。我在数据框中有几个时间戳类型的字段。所以看起来它们不能映射到“日期时间”类型的数据库文件,但为什么不呢?我正在使用此语句尝试插入数据框:
outputDS.write().mode(SaveMode.Append).jdbc(URL, tableName, properties);
还有我如何在输出数据集中创建时间戳列的语句示例:
.withColumn("DateCreated", lit(new TimeStamp(System.currentTimeMillis())).cast(DataTypes.TimestampType))
这里是模式:
数据框架构:
rDay: timestamp
rName: string
rValue: double
rId: integer
rCountry: string
rRegion: string
rCustomerId: string
rLevel: string
rUserCreated: string
rUserUpdated: string
rDateCreated: timestamp
rDateUpdated: timestamp
db 表架构:
rId bigint
rCustomerId bigint
rCountry varchar(50)
rRegion varchar(15)
rName varchar(50)
rValue decimal(8,4)
rLevel varchar(30)
rDay datetime
rUserCreated varchar(15)
rDateCreated datetime
rUserUpdated varchar(15)
rDateUpdated datetime
因此,据我了解,要将行从 spark 数据帧插入到现有的 db 表中,它们的模式必须相同。但试图实现这一点我得到了这个例外:
java.sql.SQLException:找不到类型“TIMESTAMP”
当我尝试将字段的时间戳类型更改为例如 DateType 时,我得到另一个异常,例如“数据库中已经有一个对象 'tableName'”,所以我猜这是因为这次模式不匹配。那么,有没有办法以某种方式做到这一点?提前致谢!
【问题讨论】:
-
能否用数据框架构和表架构更新问题?
-
好的,我刚刚添加了。无法从源复制,所以它是近似模式,具有实际类型
-
由于您在目标数据库中有日期时间列,您应该将数据框中的列的数据类型更改为日期时间。您还应该确保列的顺序应该相同。很久以前我在 SQL 中遇到过类似的问题,我以这种方式解决了这个问题
-
但是spark DateTypes中没有DateTime这样的类型,只有Date,不合适,因为我也需要时间。当我读到 spark Timestamp 应该映射到数据库 datetime 以及 java.sql.Timestamp 映射到 db datetime 时。不过没想到订单,也许这是个线索,谢谢
-
在这种情况下,请确保将数据框中的时间戳列转换为目标数据库用于日期时间的格式,因为不同的格式也会导致错误。
标签: java apache-spark apache-spark-sql sybase