Oozie调度报错——ORA-00918:未明确定义列

Oozie在执行sqoop的时候报错,同样的SQL在sqoop中可用,在oozie中不可用:

Caused by: java.sql.SQLSyntaxErrorException: ORA-00918: 未明确定义列

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1059)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:522)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:587)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:225)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:53)
    at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:774)
    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:925)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1111)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:4798)
    at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:4845)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1501)
    at org.apache.sqoop.mapreduce.db.DBRecordReader.executeQuery(DBRecordReader.java:111)
    at org.apache.sqoop.mapreduce.db.DBRecordReader.nextKeyValue(DBRecordReader.java:235)
    ... 12 more

Error: java.io.IOException: SQLException in nextKeyValue
    at org.apache.sqoop.mapreduce.db.DBRecordReader.nextKeyValue(DBRecordReader.java:277)
    at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:556)
    at org.apache.hadoop.mapreduce.task.MapContextImpl.nextKeyValue(MapContextImpl.java:80)
    at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.nextKeyValue(WrappedMapper.java:91)
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
    at org.apache.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.java:64)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1693)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)

原因,在使用left join的时候使用了别名。而split-by字段,没有指定别名。

<action name="sqoop-jypt-pos-his-zz-node">
        <sqoop xmlns="uri:oozie:sqoop-action:0.3">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <prepare>
                <delete path="${wf:actionData('db-shell-node')['misPath']}${wf:actionData('db-shell-node')['time']}pos_his_zz/"/>
            </prepare>
            <configuration>
                <property>
                    <name>mapred.compress.map.output</name>
                    <value>true</value>
                </property>
            </configuration>
            <arg>import</arg>
            <arg>--connect</arg>
            <arg>${wf:actionData('db-shell-node')['mis_oracle']}</arg>
            <arg>--username</arg>
            <arg>${wf:actionData('db-shell-node')['mis_oracle_jypt_username']}</arg>
            <arg>--password</arg>
            <arg>${wf:actionData('db-shell-node')['mis_oracle_jypt_password']}</arg>
            <arg>--query</arg>
            <arg>select t.storecode,t.jysj,t.syjh,t.jyh,t.syyh,t.dsyyh,b.cid,t.jyje,t.jyjf,t.thyy,t.jysbm  from pos_his_zz t  left join sjpt.DA_MMC_CARD_TG b  on t.cid||t.ccd = b.cardcode where t.optime &gt;= to_date('${wf:actionData('db-shell-node')['sql_time']}', 'yyyy-mm-ddhh24:mi:ss')   and t.optime &lt;= to_date('${wf:actionData('db-shell-node')['sql_time']}', 'yyyy-mm-ddhh24:mi:ss')+1  and $CONDITIONS</arg>
            <arg>--split-by</arg>
            <arg>t.storecode</arg>
            <arg>--null-string</arg>
            <arg>\\N</arg>
            <arg>--null-non-string</arg>
            <arg>\\N</arg>
            <arg>--fields-terminated-by</arg>
            <arg>^</arg>
            <arg>--target-dir</arg>
            <arg>${wf:actionData('db-shell-node')['misPath']}${wf:actionData('db-shell-node')['time']}pos_his_zz/</arg>
            <arg>--mapreduce-job-name</arg>
            <arg>pos_his_zz_sqoop</arg>
        </sqoop>
        <ok to="end"/>
        <error to="fail"/>
    </action>

至于为什么在sqoop中好使,这个有时间看看源码吧。

另外,Oozie在使用时间字段进行split-by的时候也会报错!

原因

在sqoop中有一个参数-m可以设置sqoop任务的并行度,默认是4。如果设置了多个并行度,sqoop就会根据split-by指定的参数拼接sql进行任务的切分。上面的例子中就没有设置-m参数,因此需要根据split-by指定的字段进行切分,拼接出来的sql由于没有设置别名而报错。但是之前在shell里面,-m别设置成了1,相当于忽略split-by参数,因此无论怎么写都不会报错。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

ExecuteReader在执行有输出参数的存储过程时拿不到输出参数

异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 后期会在博客首发更新:http://dnt...

36970
来自专栏祝威廉

PySpark如何设置worker的python命令

因为最近在研究spark-deep-learning项目,所以重点补习了下之前PySpark相关的知识,跟着源码走了一遍。希望能够对本文的读者有所帮助。

10620
来自专栏Java成神之路

Java微信公众平台开发_03_消息管理之被动回复消息

上一节,我们启用服务器配置的时候,填写了一个服务器地址(url),如下图,这个url就是回调url,是开发者用来接收微信消息和事件的接口URL 。也就是说,用户...

1.7K50
来自专栏GIS讲堂

Arcgis4js实现链家找房的效果

买房的各位亲们不知是否留意过链家的"地图找房",这样的功能对于使用者来说,是非常方便的,大家可通过连接(https://bj.lianjia.com/ditu/...

12820
来自专栏java达人

Hadoop - MapReduce

作者:tutorialspoint 译者:java达人 来源:https://www.tutorialspoint.com/hadoop/hadoop_mapr...

22280
来自专栏Hadoop实操

如何使用Flume采集Kafka数据写入Kudu

2K20
来自专栏一个会写诗的程序员的博客

13.12 Spring Boot集成Security中遇到的问题13.12 Spring Boot集成Security中遇到的问题问题1:Spring Boot集成Security使用数据库用户角色

sql语法手误。1?这地方写错了,应该是?1。这在敲代码的时候,手速一旦稍有不慎,就会导致前后顺序颠倒,而导致输入错误。这个虽然说是“低级错误”,但是错误搞起来...

10520
来自专栏杂烩

kafka连接异常 原

25620
来自专栏Jed的技术阶梯

利用Sqoop实现HDFS的数据与MySQL数据的互导

注意: 查询语句必须包含where条件,即使不需要where条件,也需要写上"where $CONDITIONS"来表示没有select语句没有where条件

13320
来自专栏Ryan Miao

MongoDB - basic

mongoDB basic from:http://www.tutorialspoint.com/mongodb prject:https://github....

33360

扫码关注云+社区

领取腾讯云代金券