将Oracle中的数据导入到hive中,发现时间格式出错,丢失小时:分钟:秒

187 阅读1分钟

本文已参与“新人创作礼”活动,一起开启掘金创作之路。​ ​

 今天由于项目需求,需要将Oracle中的某表数据使用sqoop导入到hive中,但是在导入过程中出现了一些小问题,原先时间数据为 年-月-日   时:分:秒,结果导入后别的数据没有问题,但是时间数据只有 年-月-日。这里讲如何解决这个问题。

首先先看看我导入的表结构:

第一次导入的语句:

sqoop import  --connect jdbc:oracle:thin:@192.168.100.17:1521:drcom --username drcom --password drcom --driver oracle.jdbc.driver.OracleDriver --query 'SELECT * FROM v_mid_users_online WHERE $CONDITIONS' --target-dir /user/drcom/v_mid_users_online --hive-import --fields-terminated-by '\t' --lines-terminated-by '\n' --null-string '\N' --null-non-string '\N' --m 1 --hive-drop-import-delims --hive-table bj_drcom.v_mid_users_online --hive-overwrite;

这里使用此指令导入数据:

 导入成功后,我们在hue中看导入后的表结构。

 可以看到这个时间格式数据值截取到日。一开始我也怀疑是不是hive展现出来有问题,hive中其实存着完整的数据,然后我看了看hive这个表有没有具体的时间。

可以看到hive中也是没有后面我们想要的 时:分:秒,这里我们就需要在sqoop导入的语句中修改一下指令。

发现hive导入就出了问题,我查询了以后知道我们应该在sqoop语句中加入:

--map-column-java LOGINTIME=java.sql.Timestamp --map-column-hive LOGINTIME=TIMESTAMP

 这里也拓展一下,如果有两个时间参数,eg:还有一个LOGOUTTIME参数,则书写格式如下:

--map-column-java LOGINTIME=java.sql.Timestamp,LOGOUTTIME=java.sql.Timestamp --map-column-hive LOGINTIME=TIMESTAMP,LOGOUTTIME=TIMESTAMP
修改后sqoop语句如下:

sqoop import --map-column-java LOGINTIME=java.sql.Timestamp --map-column-hive LOGINTIME=TIMESTAMP --connect jdbc:oracle:thin:@192.168.100.17:1521:drcom --username drcom --password drcom --driver oracle.jdbc.driver.OracleDriver --query 'SELECT * FROM v_mid_users_online WHERE $CONDITIONS' --target-dir /user/drcom/v_mid_users_online --hive-import --fields-terminated-by '\t' --lines-terminated-by '\n' --null-string '\N' --null-non-string '\N' --m 1 --hive-drop-import-delims --hive-table bj_drcom.v_mid_users_online --hive-overwrite;

然后执行后可以在hue中看到具体时间已经可以看到了: