我想在嵌入式 pig 程序中执行一个 pig 脚本文件,如下所示
----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");
现在修改后的代码工作正常。
所以现在我的怀疑是
最佳答案
您的 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
命令将被忽略(即它们不会自动运行),直到进一步的 PigServer.openIterator
或 PigServer.store
调用(即您明确地进行需要 STORE
行的调用)。至于你的第二个问题,你可能想看看 PigRunner 类。
关于apache-pig - 在嵌入式 pig 程序中执行带有多个存储的 pig 脚本文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12297118/