2017-03-06 55 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

希望它有帮助!

相关问题