我想在嵌入式猪程序中执行一个猪脚本文件,如下所示
---- ----- testPig.pig
A = load '/user/biadmin/student' using PigStorage() as (name:chararray);
B = foreach A generate name;
store B into '/user/biadmin/myoutput001';
为此,我编写了如下所示的代码
> PigServer pigServer = new PigServer(ExecType.MAPREDUCE);
> pigServer.registerScript("testPig.pig");
但它不起作用。我已经在grunt-shell模式下检查了这个。那里工作正常。 所以我做了这样的改变
--- testPig.pig -----
A = load '/user/biadmin/student' using PigStorage() as (name:chararray);
B = foreach A generate name;
--store B into '/user/biadmin/myoutput001';
嵌入式pig代码是
> PigServer pigServer = new PigServer(ExecType.MAPREDUCE,prt);
> pigServer.registerScript(path);
> pigServer.store("B","/user/biadmin/myoutput20");
现在修改后的代码工作正常。 所以现在我怀疑是
为什么我无法执行具有存储命令的猪脚本?
如何执行具有存储命令的pig脚本文件?
答案 0 :(得分:4)
您的PigServer
代码无效,因为;当您致电.registerScript()
时,默认情况下,PigServer
会将GruntParser
上的互动模式标记设置为false
。来自PigServer
源代码:
public void registerScript(InputStream in, Map<String,String> params,List<String> paramsFiles) throws IOException {
try {
String substituted = doParamSubstitution(in, params, paramsFiles);
GruntParser grunt = new GruntParser(new StringReader(substituted));
/********************************************/
grunt.setInteractive(false);
/********************************************/
grunt.setParams(this);
grunt.parseStopOnError(true);
} catch (org.apache.pig.tools.pigscript.parser.ParseException e) {
log.error(e.getLocalizedMessage());
throw new IOException(e.getCause());
}
}
引自GruntParser
源代码:
在交互模式下,只要遇到STORE命令,就立即执行计划。
这意味着当交互模式不活动时,STORE
命令将被忽略(即它们不会自动运行),直到PigServer.openIterator
或{{1}调用(即您明确地发出需要PigServer.store
行的调用)。
至于你的第二个问题,你可能想看一下PigRunner课程。