首页 文章

从Oracle DB读取时,Date(数据类型)到TimeStamp(数据类型)的转换不正确

提问于
浏览
0

我们试图从Oracle表中读取数据,“基于日期”的数据类型被转换为“时间戳”数据类型 .

例如:表是Oracle .

desc hr.employees;

Name Null? Type
-----------------------------------------
EMPLOYEE_ID NOT NULL NUMBER(6)
FIRST_NAME VARCHAR2(20)
LAST_NAME NOT NULL VARCHAR2(25)
EMAIL NOT NULL VARCHAR2(25)
PHONE_NUMBER VARCHAR2(20)
HIRE_DATE NOT NULL DATE
JOB_ID NOT NULL VARCHAR2(10)
SALARY NUMBER(8,2)
COMMISSION_PCT NUMBER(2,2)
MANAGER_ID NUMBER(6)
DEPARTMENT_ID NUMBER(4)
SSN VARCHAR2(55)

和Scala中的DataFrame中读取的模式

|-- EMPLOYEE_ID: decimal(6,0) (nullable = false)    
|-- FIRST_NAME: string (nullable = true)    
|-- LAST_NAME: string (nullable = false)    
|-- EMAIL: string (nullable = false)    
|-- PHONE_NUMBER: string (nullable = true)    
|-- HIRE_DATE: timestamp (nullable = false) (Incorrect data type read here)    
|-- JOB_ID: string (nullable = false)    
|-- SALARY: decimal(8,2) (nullable = true)    
|-- COMMISSION_PCT: decimal(2,2) (nullable = true)    
|-- MANAGER_ID: decimal(6,0) (nullable = true)    
|-- DEPARTMENT_ID: decimal(4,0) (nullable = true)    
|-- SSN: string (nullable = true)

Hire_Date 被错误地读作TimeStamp,有没有办法纠正 .

正在从Oracle中即时读取数据,并且应用程序没有数据类型的预先知识,并且在读取后无法转换它 .

1 回答

  • 0

    Analysis: 按照oracle -

    Oracle数据库8i及更早版本不支持TIMESTAMP数据,但Oracle DATE数据曾使用时间组件作为SQL标准的扩展 . 因此,Oracle Database 8i和早期版本的JDBC驱动程序将oracle.sql.DATE映射到java.sql.Timestamp以保留时间组件 . 从Oracle Database 9.0.1开始,包括TIMESTAMP支持,9i JDBC驱动程序开始将oracle.sql.DATE映射到java.sql.Date . 此映射不正确,因为它截断了Oracle DATE数据的时间组件 . 为了解决这个问题,Oracle Database 11.1引入了一个新的标志mapDateToTimestamp . 此标志的默认值为true,这意味着默认情况下,驱动程序将正确映射oracle.sql.DATE到java.sql.Timestamp,保留时间信息 . 如果您仍然需要不正确但10g兼容的oracle.sql.DATE到java.sql.Date映射,那么您可以通过将mapDateToTimestamp标志的值设置为false来获取它 .

    参考链接是here .

    Solution:

    • 所以按照oracle的指示提供属性jdbc.oracle.mapDateToTimestamp为false -
    Class.forName("oracle.jdbc.driver.OracleDriver")
      var info : java.util.Properties = new java.util.Properties()
      info.put("user", user)
      info.put("password", password)
      info.put("oracle.jdbc.mapDateToTimestamp", "false")
      val jdbcDF = spark.read.jdbc(jdbcURL, tableFullName, info)
    
    • 添加支持“oracle.jdbc.mapDateToTimestamp”标志的Oracle数据库连接器jar是ojdbc14.jar

    希望能帮助到你!

相关问题