在嵌入式猪程序中执行带有多个商店的猪脚本文件

时间:2012-09-06 09:35:44

标签: apache-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");

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

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

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

1 个答案:

答案 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课程。