从HDFS导出数据到oracle时,sqoop无法长时间转换为时间戳

问题描述

我在hdfs中有一个csv文件,格式为:

000000131,2020-07-22,0.0,"",1595332359218,khf987ksdfi34
000000112,1595442610265,khf987ksdfi34
000000150,1595442610438,khf987ksdfi34

我想使用以下sqoop将此文件导出到oracle:

sqoop export --connect "jdbc:oracle:thin:@(description=(address=(protocol=tcp)(host=oracledb)(port=1521))(connect_data=(service_name=stgdb)))" --table CORE_ETL.DEPOSIT_TURNOVER --username xxxx --password xxxx --export-dir /tmp/merged_deposit_turnover/ --input-fields-terminated-by "," --input-lines-terminated-by '\n' --input-optionally-enclosed-by '\"' --map-column-java DATE=java.sql.Date,INSERT_TS=java.sql.Timestamp

但是该过程以以下错误结束:

    Caused by: java.lang.RuntimeException: Can't parse input data: '1595332359218' at 
CORE_ETL_DEPOSIT_TURNOVER.__loadFromFields(CORE_ETL_DEPOSIT_TURNOVER.java:546) at 
CORE_ETL_DEPOSIT_TURNOVER.parse(CORE_ETL_DEPOSIT_TURNOVER.java:431) at   
org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:88) ... 10 more Caused 
by: java.lang.IllegalArgumentException at java.sql.Date.valueOf(Date.java:143) at 
CORE_ETL_DEPOSIT_TURNOVER.__loadFromFields(CORE_ETL_DEPOSIT_TURNOVER.java:529) ... 12 more

我想知道是否有一种方法可以在不更改HDFS中数据格式的情况下将该文件导出到oracle。

也是oracle模式:

enter image description here

解决方法

根据sqoop官方文档: https://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html#_export_date_and_timestamp_data_types_into_oracle

从hdfs导出数据时,如果数据不是必需的格式,并且时间戳的必需格式为yyyy-mm-dd hh24:mi:ss.ff,则Sqoop导出命令将失败。因此,您必须格式化文件中的时间戳以符合上述格式,才能正确导出到Oracle。