如何将日期/时间戳字符串写入oracledb中的datetimestamp列?

jljoyd4f  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(554)

我在hadoop中存储了一些oracle表,使用avro文件格式和hive外部表来访问数据。
我使用 TO_CHAR 从oracle导入函数。
现在我想用spark将这个精确的数据导出回一个具有date列的oracle表。我使用命令:

// Create a data frame from the Hive table
val data = sqlContext.sql("select * from avro_table")

// export df to existing oracle table
data.write.mode("overwrite").jdbc(jdbcString, "tableName", prop)

但是我得到了一个错误:
ora-00902:无效的数据类型
这是因为它试图在日期列中插入字符串。有没有一种安全的方法可以将sparkDataframe中的日期/时间戳字符串插入到oracle的日期/时间戳列中?我的意思是不要丢失任何时区信息。

1tuwyuhd

1tuwyuhd1#

您应该使用to\u date、to\u timestamp和/或date\u format函数将字符串化的日期/时间戳值转换为相应的类型感知值。
日期\格式(dateexpr:column,format:string):column将日期/时间戳/string转换为string值,格式由第二个参数给定的日期格式指定。
tou date(e:column,fmt:string):column将列转换为具有指定格式的日期类型(请参见http://docs.oracle.com/javase/tutorial/i18n/format/simpledateformat.html)如果失败,则返回null。
tou timestamp(s:column,fmt:string):column将时间字符串转换为具有指定格式的unix时间戳(以秒为单位)(请参阅http://docs.oracle.com/javase/tutorial/i18n/format/simpledateformat.html)对于unix时间戳(以秒为单位),如果失败,则返回null。
使用 select 或者 withColumn 操作员。
示例代码可以如下所示:

data.withColumn("real_date", date_format(...))
  .write
  .mode("overwrite")
  .jdbc(jdbcString, "tableName", prop)

相关问题