2017-03-06 2 views
0

"日付"ベースのデータ型は "タイムスタンプ"データ型に変換されます。Oracle DBからの読込み中にDate(データ型)からTimeStamp(データ型)への変換が正しくありません

例:表はOracleです。スカラ

|-- 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を読み取る

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) 

とスキーマタイムスタンプとして誤って読み出され、補正する方法があります。

データはOracleからすぐに読み取られており、アプリケーションはデータ型の初期知識がなく、読み取られた後で変換することはできません。

+0

"DATE"タイプはタイムスタンプを表します – seneque

+0

OracleはDATEとTIMESTAMPの両方を持っていますが、正しく理解すれば両方が同義語であると言いますか? – user3277966

答えて

0

分析:オラクルあたりとして -

のOracle Database 8iの以前のバージョンでは、TIMESTAMP データをサポートしていますが、SQL標準に 拡張としての時間コンポーネントを持つように使用されるOracle DATEデータはなかったです。したがって、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です。

ソリューション:

  1. 神託によって指示されたようにはfalseとプロパティ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データベースコネクタJARを追加します。 mapDateToTimestamp "フラグはojdbc14.jarです。

希望すると助かります!

関連する問題