3

我想在嵌入式猪程序中执行猪脚本文件,如下所示

----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';

嵌入式猪代码是

> PigServer pigServer = new PigServer(ExecType.MAPREDUCE,prt);
> pigServer.registerScript(path);
> pigServer.store("B","/user/biadmin/myoutput20");

现在修改后的代码工作正常。所以现在我的疑问是

  1. 为什么我无法执行具有存储命令的猪脚本?

  2. 如何执行具有存储命令的猪脚本文件?

4

1 回答 1

4

您的PigServer代码不起作用,因为;默认情况下,当您调用 时.registerScript()PigServer会将交互模式标志设置GruntParserfalse。从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.openIteratorPigServer.store调用(即您明确地发出需要该STORE行的调用)。

至于你的第二个问题,你可能想看看PigRunner类。

于 2012-09-09T06:56:44.090 回答