本文已参与“新人创作礼”活动,一起开启掘金创作之路。
今天由于项目需求,需要将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中看到具体时间已经可以看到了: