【问题标题】:How to write date / timestamp string to Date timestamp column in Oracle DB?如何将日期/时间戳字符串写入 Oracle DB 中的日期时间戳列?
【发布时间】:2017-12-09 12:42:21
【问题描述】:

我使用 AVRO 文件格式和 Hive 外部表在 Hadoop 中存储了一些 Oracle 表来访问数据。
我在导入时使用 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 日期/时间戳列?安全我的意思是不要丢失任何时区信息。

【问题讨论】:

  • 您能否在问题中包含 data.printSchema 和 Oracle 中日期列的格式以使其完整,从而使答案变得“更好”?

标签: oracle hadoop apache-spark hive avro


【解决方案1】:

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

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

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

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

使用selectwithColumn 运算符。

示例代码如下:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 2022-01-03
  • 2023-03-05
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
相关资源
最近更新 更多