我已经使用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日期/时间戳列?安全我的意思是不要丢失任何时区信息。
答案 0 :(得分:1)
您应该使用to_date,to_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。
使用select
或withColumn
运营商。
示例代码如下:
data.withColumn("real_date", date_format(...))
.write
.mode("overwrite")
.jdbc(jdbcString, "tableName", prop)