首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从hdfs到oracle的sqoop导出错误

问从hdfs到oracle的sqoop导出错误
EN

Stack Overflow用户
提问于 2015-09-12 17:14:25
回答 6查看 5.9K关注 0票数 3

使用的命令:

代码语言:javascript
复制
sqoop export --connect jdbc:oracle:thin:@//xxx:1521/BDWDEV4 --username xxx --password xxx --table TW5T0 --export-dir '/data/raw/oltp/cogen/oraclexport/TW5T0/2015-08-18' -m 8 --input-fields-terminated-by '\001' --lines-terminated-by '\n' --input-escaped-by '\"' --input-optionally-enclosed-by '\"'

目标表包含oracle中数据类型为date的列,但如错误所示,它将简单的date解析为时间戳

错误:

代码语言:javascript
复制
15/09/11 06:07:12 INFO mapreduce.Job:  map 0% reduce 0% 15/09/11 06:07:17 INFO mapreduce.Job: Task Id : attempt_1438142065989_99811_m_000000_0, Status : FAILED Error: java.io.IOException: Can't export data, please check failed map task logs
        at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:112)
        at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:39)
        at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
        at org.apache.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.java:64)
        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:340)
        at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:415)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1594)
        at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163) Caused by: java.lang.RuntimeException: Can't parse input data: '2015-08-15'
        at TZ401.__loadFromFields(TZ401.java:792)
        at TZ401.parse(TZ401.java:645)
        at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:83)
        ... 10 more Caused by: java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
       at java.sql.Timestamp.valueOf(Timestamp.java:202)
        at TZ401.__loadFromFields(TZ401.java:709)
        ... 12 more
EN

回答 6

Stack Overflow用户

发布于 2017-08-10 13:37:04

您应该在sqoop导出中使用--map-column-java参数,而不是在Hadoop中更改数据文件。

例如,如果您的Oracle表中有两个名为DATE_COLUMN_1和DATE_COLUMN_2的DATE列,则可以将以下参数添加到您的sqoop命令中:

代码语言:javascript
复制
--map-column-java DATE_COLUMN_1=java.sql.Date,DATE_COLUMN_2=java.sql.Date

如前所述,必须在Hadoop文本文件中使用JDBC格式。但在这种情况下,yyyy-mm-dd将起作用。

票数 4
EN

Stack Overflow用户

发布于 2015-09-12 20:37:25

来自http://archive.cloudera.com/cdh/3/sqoop/SqoopUserGuide.html#_dates_and_times,

SQL将DATE和TIME

类型表示为时间戳值。Oracle数据库中的任何日期列都将作为时间戳导入Sqoop中,并且Sqoop生成的代码将把这些值存储在java.sql.Timestamp字段中。

在将数据导出回数据库时,Sqoop会将文本字段解析为时间戳类型(格式为yyyy-mm-dd HH:MM:SS.ffffffff),即使您希望这些字段使用JDBC日期转义格式yyyy-mm-dd进行格式化。导出到Oracle的日期应格式化为完整时间戳。

因此,在导出到Oracle之前,您需要将文件中的日期格式设置为符合yyyy-mm-dd HH:MM:SS.ffffffff格式。

编辑:

回复评论,

在hdfs中有大约70个文件(表)我需要export..So,在所有文件中我需要将日期从yyyy-mm-dd改为yyyy-mm-dd HH:MM:SS.ffffffff,任何简单的格式化方法都可以。

您可以编写一个awk脚本来为您完成此操作。或者,您可以检查以下想法是否有效:

DML

  • 创建一个新的临时表TEMPIMPORT,其结构与表TW5T0相同,只是使用Sqoop将DATE数据类型为VARCHAR2

  • Load的列更改为新的临时表TEMPIMPORT.

  • Run下面的TW5T0,以便将数据导出回DATE TW5T0 (当然还有commit ):

从tempimport);插入tw5t0 (select [all_your_columns_here_except_date_column],to_date(date_column,'yyyy-mm-dd') )

票数 1
EN

Stack Overflow用户

发布于 2015-09-16 01:16:04

导出sqoop中使用的--connection-param-file ora.porperties

ora.properties包含oracle.jdbc.mapDateToTimestamp=false

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32537148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档