我在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的日期/时间戳列中?我的意思是不要丢失任何时区信息。
1条答案
按热度按时间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
操作员。示例代码可以如下所示: