2017-03-06 96 views
0

讀取我們正在嘗試讀取從Oracle表數據,「日期」爲基礎的數據類型被轉換成「時間戳」的數據類型。日期(數據類型)時間戳(數據類型)的不正確的轉換而從Oracle DB

例如:表是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) 

和模式在斯卡拉

|-- 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被錯誤地解讀爲時間戳讀取數據幀,是有辦法來糾正。

數據正在從Oracle在飛行閱讀和應用程序沒有數據類型的前期知識和讀取後無法將它轉換。

+0

在Oracle中「DATE」類型代表時間戳 – seneque

+0

Oracle既有DATE也有TIMESTAMP,如果我理解正確,你說的都是同義詞? – user3277966

回答

0

分析: 按照神諭 -

Oracle數據庫8i和更早版本不支持TIMESTAMP 數據,而是使用了Oracle最新數據有一個時間組件作爲 擴展SQL標準。因此,Oracle數據庫8i和更早版本的 JDBC驅動程序將oracle.sql.DATE映射到java.sql.Timestamp 以保留時間組件。與Oracle數據庫9.0.1開始, TIMESTAMP支持被列入和9i JDBC驅動程序啓動映射 oracle.sql.DATE以java.sql.Date。此映射不正確,因爲它會截斷Oracle DATE數據的時間組件。爲了克服這個問題,Oracle數據庫11.1引入了一個新標誌 mapDateToTimestamp。此標誌的默認值爲true,其中 表示默認情況下,驅動程序會將oracle.sql.DATE 正確映射到java.sql.Timestamp,並保留時間信息。如果仍然想要 不正確但與10g兼容的oracle.sql.DATE映射到java.sql.Date ,那麼可以通過將 的值設置爲mapDateToTimestamp標誌爲false。

參考鏈接是here

解決方案:

  1. 所以甲骨文的指示提供物業jdbc.oracle.mapDateToTimestamp假 -

    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) 
    
  2. 添加支持「oracle.jdbc Oracle數據庫連接器罐子。 mapDateToTimestamp「標誌是ojdbc14.jar

希望它有幫助!

相關問題