如何将日期/时间戳字符串写入Oracle DB中的Date timestamp列?

时间:2017-12-09 12:42:22

标签: oracle hadoop apache-spark hive avro

我已经使用AVRO文件格式在Hadoop中存储了一些Oracle表,并使用Hive外部表来访问数据 我已将Date和Timestamp值存储为格式化字符串,使用导入时来自Oracle的TO_CHAR函数。

现在我想用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:数据类型无效

这是因为它尝试将字符串插入日期列。有没有一种安全的方法可以将Spark数据帧中的日期/时间戳字符串插入Oracle日期/时间戳列?安全我的意思是不要丢失任何时区信息。

1 个答案:

答案 0 :(得分:1)

您应该使用to_dateto_timestamp和/或date_format函数将字符串化日期/时间戳值转换为相应的类型感知值

  

date_format(dateExpr:Column,format:String):Column 将日期/时间戳/字符串转换为字符串值,格式为第二个参数指定的日期格式指定的格式。

     

to_date(e:Column,fmt:String):列将列转换为具有指定格式的DateType(请参阅http://docs.oracle.com/javase/tutorial/i18n/format/simpleDateFormat.html)如果失败则返回null。

     

to_timestamp(s:Column,fmt:String):列将时间字符串转换为具有指定格式的Unix时间戳(以秒为单位)(请参阅http://docs.oracle.com/javase/tutorial/i18n/format/simpleDateFormat.html)到Unix时间戳(在秒),如果失败则返回null。

使用selectwithColumn运营商。

示例代码如下:

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