oracle数据库中Date类型倒入到hive中出现时分秒截断问题解决方案

本文介绍了一种使用SQOOP将Oracle数据导入HIVE时遇到的日期截断问题及其解决方案。通过调整--map-column-java和--map-column-hive参数,可以确保日期字段能够精确到秒。

1.问题描述:

    用sqoop将oracle数据表倒入到hive中,oracle中Date型数据会出现时分秒截断问题,只保留了‘yyyy-MM-dd',而不是’yyyy-MM-dd HH24:mi:ss'格式的,后面的‘HH24:mi:ss’被自动截断了,在对时间要求到秒级的分析处理中这种截断会产生问题。

2.解决方案:

    在用sqoop倒入数据表是,添加--map-column-hive 和--map-column-java参数,来改变数据表列的默认映射类型(默认情况下sqoop倒入hive中Date类型会被映射成String),将Date列映射成Timestamp类型,在我的问题中我是通过sqoop创建job,进行数据表按时间增量倒入的,PASSTIME列的数据类型是Date,脚本如下:

sqoop job --create jobimport2hiveofv_vehicleinfo -- import --hive-import --map-column-java PASSTIME=java.sql.Timestamp --map-column-hive PASSTIME=TIMESTAMP --incremental append --connect jdbc:oracle:thin:@118.228.196.29:1521/pmptgdbanalyze --username SAN --password PASS --verbose -m 1 --bindir /opt/sqoop-1.4.4/lib --table V_VEHICLEINFO --check-column PASSTIME --last-value '2014-04-20 12:00:00'

注意:

1)红色字体标注的两个参数用来改变列的映射类型,蓝色字体标注的是数据类型,java.sql.Timestamp要带包名写全,否则可能会出错。

2)--map-column-java和--map-column-hive连个参数都要显示给出,如果只给出--map-column-hive那么只会改变hive中表列的数据类型,而codegen生成的Tablename.java源文件中还会是java.sql.Date类型,这样在转换成hive表中的TIMESTAMP类型时,就会出错导致hive中的PASSTIME字段全部为null。原因可能是由于Date类型默认格式‘yyyy-M-dd',而转化到hive Timestamp类型时,严格要求按照’yyyy-mm-dd hh:mm:ss[.f...]'格式转换,参见hive官网timestamp格式说明。

3)如果不设置--map-column-hive参数,只设置--map-column-java 为java.sq..Timestamp,也可以实现数据精确到时分秒,只不过以string类型保存到列hive中。事实上,在我实验后,发现如果指定--mapcolumn-hive参数为timestamp,在java中使用对应的时间where比较条件时,无法查出数据,反而,指定--map-column-hive参数为string,却能够在hive中和java代码中都能够使用时间列参与查询。

<think> 我们正在讨论Oracle数据库,而不是Hive。用户的问题是:Oracle中current_date函数返回结果是精确到天还是包含时分秒? 根据引用[1]中的对比表格,Oracle的当前日期函数是sysdate(或current_date),但表格中显示Oracle的"年月日"使用to_char(sysdate,'YYYY-MM-DD'),而"时分秒"使用to_char(sysdate,'hh24:mi:ss')。但是,我们需要明确current_date函数的具体行为。 实际上,在Oracle中,current_date函数与sysdate函数类似,但有一个重要区别:current_date返回的是当前会话时区的当前日期和时间,而sysdate返回的是数据库服务器操作系统的日期和时间。但两者都包含日期和时间(即时分秒)。 然而,引用中没有直接提到current_date。我们需要从其他引用中推断。引用[3]讨论了datetimestamp类型,其中date类型Oracle中实际上包含日期和时间(精确到秒),而timestamp可以包含小数秒(最高9位)。因此,Oracle中的DATE类型总是包含日期和时间(精确到秒)。 Oracle的current_date函数返回的是一个DATE类型的数据,因此它必然包含时分秒。 为了确认,我们可以参考Oracle官方文档:current_date函数返回当前会话时区的当前日期,数据类型DATE。而OracleDATE数据类型包含年、月、日、时、分、秒。 因此,答案是:Oracle的current_date函数返回的结果包含时分秒。 但是,用户可能会看到显示问题:当使用SQL*Plus等工具查询时,如果默认的日期格式只显示日期部分,那么可能看不到时间部分。但实际值中是包含时间的。可以通过设置会话的日期格式来显示时间部分。 例如: 默认情况下,SELECT current_date FROM dual; 可能只显示日期(如05-OCT-23),但实际上包含时间。 我们可以通过改变会话的日期格式来验证: ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'; SELECT current_date FROM dual; 此时将显示完整的日期和时间。 所以,结论是:Oracle的current_date函数返回DATE类型,包含时分秒。但显示格式可能默认不显示时间部分。 引用[1]中在Oracle部分提到“年月日”使用to_char(sysdate,'YYYY-MM-DD'),这暗示了sysdate(以及current_date)是包含时间的,所以需要使用to_char来提取日期部分。 因此,在回答中,我们需要明确指出current_date返回的是包含时分秒DATE类型,并解释如何显示完整时间。 此外,根据用户提供的引用[2],我们注意到to_date函数在转换时如果格式字符串包含时间部分,则可以解析时间,这也印证了日期类型包含时间。 引用[3]中说明了date类型timestamp类型的区别,其中date类型包含时分秒(但精度只到秒,没有小数秒),而timestamp可以有更高精度。 引用[4]中的months_between函数的例子也使用了包含时分秒的日期值。 因此,我们可以这样回答: 在Oracle中,current_date函数返回的是当前会话时区的当前日期和时间,数据类型DATEDATE类型Oracle中总是包含时分秒(精确到秒)。但是,默认的日期显示格式可能只显示日期部分,通过修改NLS_DATE_FORMAT会话参数可以显示完整的日期和时间。 示例: 1. 默认情况下的查询: SELECT current_date FROM dual; -- 可能显示:05-OCT-23 2. 修改会话日期格式后: ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'; SELECT current_date FROM dual; -- 将显示:2023-10-05 14:30:45 因此,current_date返回的是包含时分秒的完整日期时间值。 注意:与current_date类似的sysdate函数返回的是数据库服务器操作系统的日期和时间(同样包含时分秒),而current_date返回的是会话时区的日期和时间。 生成相关问题: 1. Oracle中current_date和sysdate有什么区别? 2. 如何修改Oracle的日期显示格式以包含时间? 3. OracleDATE类型TIMESTAMP类型有什么区别? </think> ### Oracle中`current_date`函数返回结果解析 根据引用内容,Oracle的`current_date`函数返回结果**包含时分秒**,精确到秒级(非仅日期)。以下是详细解释: 1. **返回值类型与精度** - `current_date`返回的是Oracle的`DATE`数据类型(引用[3]) - `DATE`类型Oracle中**始终包含7个字段**:年、月、日、时、分、秒 $$ \text{DATE} = \{ \text{year}, \text{month}, \text{day}, \text{hour}, \text{minute}, \text{second} \} $$ - 对比Hive的`current_date`仅返回日期部分(YYYY-MM-DD),Oracle的返回值格式为: `YYYY-MM-DD HH24:MI:SS` 2. **与相关函数的区别** | 函数 | 返回类型 | 是否包含时分秒 | 精度 | 用例 | |------|-----------|----------------|-------|-------| | `current_date` | `DATE` | ✅ | 秒级 | 会话时区当前时间 | | `sysdate` | `DATE` | ✅ | 秒级 | 数据库服务器时间 | | `to_char(sysdate,'YYYY-MM-DD')` | 字符串 | ❌ | 日期 | 仅日期格式化 | 3. **验证方法** 通过显式格式化可验证包含时分秒(引用[1][2]): ```sql -- 查询完整时间(含时分秒) SELECT TO_CHAR(current_date, 'YYYY-MM-DD HH24:MI:SS') FROM dual; -- 结果示例:2023-10-05 14:30:45 -- 对比:仅提取日期部分 SELECT TO_CHAR(current_date, 'YYYY-MM-DD') FROM dual; -- 结果示例:2023-10-05 ``` 4. **关键注意事项** - **时区依赖**:`current_date`返回**当前会话时区**的时间(而`sysdate`返回数据库服务器时区时间) - **隐式格式化风险**:直接查询可能只显示日期部分(取决于工具配置),需用`TO_CHAR`显式格式化查看完整时间 - **计算兼容性**:与`months_between`等函数计算时,时分秒会影响结果精度(引用[4]) --- ### 总结 Oracle的`current_date`返回值**包含完整的时分秒信息**(格式:`YYYY-MM-DD HH24:MI:SS`),其本质是Oracle的`DATE`类型,与仅返回日期的Hive实现有根本区别。若需仅日期部分,必须使用`TO_CHAR(current_date, 'YYYY-MM-DD')`显式格式化[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值