Java 将表导入Sqoop时出现错误ORA-01843

Java 将表导入Sqoop时出现错误ORA-01843,java,oracle,apache,hadoop,sqoop,Java,Oracle,Apache,Hadoop,Sqoop,我已经将一个包含5400万行的表导入到Hadoop集群的HDFS中,现在,从Oracle DB导入该表的一部分 [我创建了一个视图,只选择了一个较短的时间段。结果只有260K行] ,我得到的错误如下: 错误:java.io.IOException:nextKeyValue中的SQLException位于 org.apache.sqoop.mapreduce.db.DBRecordReader.nextKeyValue(DBRecordReader.java:277) 在 org.apache.h

我已经将一个包含5400万行的表导入到Hadoop集群的HDFS中,现在,从Oracle DB导入该表的一部分
[我创建了一个视图,只选择了一个较短的时间段。结果只有260K行]
,我得到的错误如下:

错误:java.io.IOException:nextKeyValue中的SQLException位于 org.apache.sqoop.mapreduce.db.DBRecordReader.nextKeyValue(DBRecordReader.java:277) 在 org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:556) 在 org.apache.hadoop.mapreduce.task.MapContextImpl.nextKeyValue(MapContextImpl.java:80) 在 org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.nextKeyValue(WrappedMapper.java:91) 位于org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145) org.apache.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.java:64) 位于org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787)
位于org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168)位于 java.security.AccessController.doPrivileged(本机方法)位于 javax.security.auth.Subject.doAs(Subject.java:422)位于 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1709) 位于org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162)
原因:java.sql.SQLDataException:ORA-01843:不是有效月份

使用的命令是:

sqoop导入--connect jdbc:oracle:thin:@--username--password--table--NUM_行拆分--m10--target dir/user/rodrigo/SLICED_table 2>&1|tee import_tab_menor.txt

我是Hadoop/Hive/Sqoop新手,这只是为了学习,但我真的想知道如何解决这个问题

我曾考虑过创建一个视图,将日期数据类型更改为字符串,只是为了导入表,但这会给我带来不准确的结果

编辑:

我发现这是视图创建中的一个内部DB错误。 我创建视图的方式返回了我需要的结果。但这是一种错误的创造方法

在Sqoop内部的查询中,您需要将最后一个
和\$CONDITIONS
分开,并将查询发送到Oracle的格式为
截止日期('02/04/16','dd/mm/yy')
。然后它成功了

为了绕过这个错误,我创建了一个视图,将日期字段的数据类型更改为varchar,但由于某些原因,它也无法工作

所以我又用
改成了_number(改成_char('02/04/16','dd/mm/yy'))
使它工作起来

我不想结束这个问题,因为我想知道这个问题的答案。
如果我找到了,我将与大家分享。

这个问题最常见的原因是,您有带关键字的列名称,例如,将列命名为“key”或“order”(只是一个伪示例),请尝试像这样导入表


--查询“select*from DB.TABLE where\$CONDITIONS”

错误在于我创建视图的方式:

我已经使用文本格式创建了视图来选择日期间隔

差不多

DT_F>'02/04/16

但是当我使用

截止日期('02/04/16','dd/mm/yy')


错误ORA-01843不再出现。

它在错误消息中表示
ORA-01843:不是有效月份
。看起来您需要检查数据是否正确validity@Pushkr是的,我已经检查了数据,它与我以前导入的数据相同。不知道为什么会发生这种情况。“数据是相同的”--没错,但这种错误消息意味着您的
创建视图中存在错误,或者某个地方的配置不匹配。是否有包含日期的字符串列?或者使用字符串文字(如“01-JAN-2000”)对日期列应用WHERE子句?Cf.@SamsonScharfrichter No,我创建了一个视图,其中DT_F='02/04/16'
,我的表中有一个
Select*,因为DB中的区域设置是America/Sao_Paulo。该字段是日期,而不是字符串。我已经导入了整个表,每个作业除以10 Mi行,一切都很好……您是否尝试了
其中DT_F=date'2016-04-02'
以确保文字转换为使用ISO格式的日期(Oracle可以使用索引)?因为它可能是转换成字符串的列;或者,它可能是用于解析日期的当前会话的区域设置;在查询编辑器中,您的区域设置可能是“圣保罗”,但我很确定JDBC并没有强制执行该区域设置,这就解释了为什么Oracle试图将
02/04/16
解析为
dd MMM yyyy
,因此您会看到错误。我将您所说的与@SamsonScharfrichter建议合并,从而使其正常工作。谢谢你们两位。