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参数,因此无论怎么写都不会报错。

本文转自博客园xingoo的博客,原文链接:Oozie调度报错——ORA-00918:未明确定义列,如需转载请自行联系原博主。

时间: 2024-09-27 01:59:06

Oozie调度报错——ORA-00918:未明确定义列的相关文章

c# .net mvc-MVC4上传图片并显示,点击上传foreach遍历报错,提示未设置对象实例化?

问题描述 MVC4上传图片并显示,点击上传foreach遍历报错,提示未设置对象实例化? 如图所示是我所用到的代码及运行后报错的提示,调试过后发现遍历时var x的值为空,可是却不知道该怎么实例化,请指教!在线等,谢谢谢谢! 解决方案 要看你的代码,是不是控制器没有把模型传过来.

j uery ajax-jquery 报错提示有未定义

问题描述 jquery 报错提示有未定义 java程序,目的是:遍历Table中的Checkbox,如果被check了,则调用后台FileListServlet中的某个action 初步涉及,写了如下脚本,请问为什么一直报错:Uncaught ReferenceError: $ is not defined $("#btnExecute").click(function(){ $("#tbFileList").find(":checkbox:checked

native-Android奇怪报错,根本未提及我的应用啊,求大神赐教

问题描述 Android奇怪报错,根本未提及我的应用啊,求大神赐教 Crash happen at 2016-01-25 17:34:35 process:com.android.dialer pid:7272 Classname:android.view.WindowManager$BadTokenException Filename:ViewRootImpl.java Methodname:setView LineNumber:615 Cause:Unable to add window -

java spring junit-java junit测试报错找不到自己定义的xml文件 跪求各位高手帮忙解决一下

问题描述 java junit测试报错找不到自己定义的xml文件 跪求各位高手帮忙解决一下 eclipse下junit测试时遇到如下错误,错误内容如下: at jp.co.dgic.eclipse.jdt.internal.junit.runner.DJUnitRunner.main(DJUnitRunner.java:49) caused by:org.springframework.beans.factory. BeanDefinitionStoreException:IoException

select-oracle分页执行后未明确定义列

问题描述 oracle分页执行后未明确定义列 select * from (select temp.*, rownum row_id from (select l.*, M.mcol1, R.rcol1, R.rcol2, B.col1, B1.col1 --这里需要取与B同一个字段的值但是条件不同 from table_l JOIN TABLE_R R ON L.ID = R.R_ID JOIN TABLE_M M ON L.TYPE = M.TYPE JOIN TABLE_B B ON L.

网站上线正常运行一天后,报错System.NullReferenceException: 未将对象引用设置到对象的实例

问题描述 报错信息:我要是把<%#Edu.Common.HelpCommon.GetSubString(Eval("Titles").ToString(),17)%>改写成<%#Eval("Titles")%>错误行就会显示下一个<%#Edu.Common.HelpCommon.GetSubString(Eval("Titles").ToString(),17)%>调用方法如下:publicstaticstri

电脑报错:无线未启用DHCP报错的解决方法

1.右键电脑上的网络图标,选择"属性":     2.打开网络和共享中心之后,我们点击里面的"本地连接":     3.打开本地连接状态窗口之后,我们点击设置窗口地下的"属性":     4.打开本地连接属性设置窗口之后,我们点击"Internet 协议版本4(TCP/IPV4)",然后点击底下的"属性":     5.打开Internet 协议版本4(TCP/IPV4)设置窗口之后,我们勾选"自

自己写的一个抓取网页内容的小东西,但是不知道提示网页报错,求大神看看!

问题描述 usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Net;usingSystem.IO;usingSystem.Text.RegularExpressions;namespaceConsoleApplication3{classProgram{staticvoidMain(string[]args){//stringurl="http://172.16.10

数据库-sql server新插入一列报错

问题描述 sql server新插入一列报错 sqlserver数据库想在一列后面新加一列 alter table Factors_copy Add EPIBS DECIMAL(18,5) AFTER ETP5 总是会报错 [Err] 42000 - [SQL Server]'AFTER' 附近有语法错误. 是不是sqlserver不支持这么写呢 急,请问该怎么解决 解决方案 sql server的语法 ALTER TABLE 表名 add 字段 数据类型 其他约束 示例 ALETER TABL