首页 > 代码库 > sqoop 从oracle导数据到hive中,date型数据时分秒截断问题

sqoop 从oracle导数据到hive中,date型数据时分秒截断问题

oracle数据库中Date类型倒入到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.参考说明:

sqoop user guide: http://sqoop.apache.org/docs/1.4.5/SqoopUserGuide.html#_selecting_the_data_to_import 查看map-column-hive和map-column-java参数说明

hive languageManual: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-timestamp 查看hive支持的时间类型说明

hive日期函数
http://athenaxu.blog.163.com/blog/static/2057220392014025332775/
hive数据类型转换
http://www.iteblog.com/archives/892

hive开启行转列功能:
> set hive.cli.print.header=true; // 打印列名
> set hive.cli.print.row.to.vertical=true; // 开启行转列功能, 前提必须开启打印列名功能
> set hive.cli.print.row.to.vertical.num=1; // 设置每行显示的列数
> select * from example_table where pt=‘2012-03-31‘ limit 2;

hive查看数据表结构、列类型

> desc TableName;

sqoop 从oracle导数据到hive中,date型数据时分秒截断问题