问题
sqoop1从oracle数据库中向hive拉取parquet表后,原本oracle中 "yyyy-mm-dd hh24:mi:ss.ff"
格式的时间,在hive parquet表中成了13位的“时间戳”,其中后三位是常规10位秒级时间戳后的毫秒
示例
oracle的字段:
sqoop导入hive:
sqoop import \
--connect <connect> \
--username <username> \
--password <username> \
--query "SELECT * FROM XXX WHERE \$CONDITIONS" \
--hive-import \
--hive-table test \
--split-by ID \
--target-dir /user/hive/warehouse/ \
--as-parquetfile
查看时间字段:
[slave01:21000] default> select COMPLETE_TIME from test limit 1;
Query: select COMPLETE_TIME from test limit 1
Query submitted at: 2019-02-28 15:58:53 (Coordinator: https://slave01:25000)
Query progress can be monitored at: https://slave01:25000/query_plan?query_id=f84d7876d3434df6:2da14b0000000000
+---------------+
| complete_time |
+---------------+
| 1525252558701 |
+---------------+
Fetched 1 row(s) in 4.08s
解决方法
添加参数 --map-column-java
和 --map-column-hive
来改变数据表列的默认映射类型
再次导入hive
sqoop import \
--connect <connect> \
--username <username> \
--password <username> \
--query "SELECT * FROM XXX WHERE \$CONDITIONS" \
--hive-import \
--hive-table test2 \
--map-column-java COMPLETE_TIME=String \
--map-column-hive COMPLETE_TIME=String \
--split-by ID \
--target-dir /user/hive/warehouse/ \
--as-parquetfile
查看时间字段:
[slave01:21000] default> select COMPLETE_TIME from test2 limit 1;
Query: select COMPLETE_TIME from test2 limit 1
Query submitted at: 2019-02-28 16:11:35 (Coordinator: https://slave01:25000)
Query progress can be monitored at: https://slave01:25000/query_plan?query_id=9d4a92bcfe931f6e:7bd9706900000000
+-------------------------+
| complete_time |
+-------------------------+
| 2017-08-25 10:30:00.266 |
+-------------------------+
Fetched 1 row(s) in 3.39s
可以看到,时间存为了 "yyyy-mm-dd hh24:mi:ss.ff"
格式
注:虽然这里时间字段是String,但使用impala时可自动识别字符串中的时间,以时间函数的形式进行读取、计算等操作
网友评论