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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle数据库的数据迁移到Hive可以通过以下步骤实现: 1. 在Oracle数据库,将需要迁移的数据导出为CSV文件。 2. 将CSV文件上传至Hadoop分布式文件系统(HDFS)。 3. 在Hive创建与CSV文件相对应的表结构。 4. 使用Hive的LOAD DATA INPATH语句将CSV文件的数据导入到Hive。 以下是具体的步骤: 1. 在Oracle数据库,使用SQL*Plus或任何其他工具,将需要迁移的数据导出为CSV文件。例如,可以使用以下语句将表my_table的数据导出为CSV文件: ``` SELECT * FROM my_table INTO OUTFILE 'my_table.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n'; ``` 2. 将CSV文件上传至HDFS。可以使用以下命令将文件上传至HDFS: ``` hdfs dfs -put my_table.csv /user/hive/import/ ``` 这将CSV文件上传至HDFS的/user/hive/import/目录。 3. 在Hive创建与CSV文件相对应的表结构。可以使用以下命令创建表: ``` CREATE TABLE my_table ( column1 datatype1, column2 datatype2, ... ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE; ``` 请确保列名和数据类型与CSV文件的列名和数据类型相匹配。 4. 使用Hive的LOAD DATA INPATH语句将CSV文件的数据导入到Hive。可以使用以下命令将数据加载到Hive: ``` LOAD DATA INPATH '/user/hive/import/my_table.csv' INTO TABLE my_table; ``` 这将CSV文件的数据导入到Hive表my_table。 完成以上步骤后,Oracle数据库的数据就可以成功迁移到Hive了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值