在嵌入式pig程序中使用多个存储执行pig脚本文件

vbopmzt1  于 2021-06-24  发布在  Pig
关注(0)|答案(1)|浏览(375)

我想在嵌入式pig程序中执行一个pig脚本文件,如下所示
----测试Pig。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");

但它不工作。我已经在咕噜shell模式下检查过了。它在那儿工作得很好。所以我做了这样的改变
---测试Pig。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");

现在修改后的代码运行良好。所以现在我的疑问是
为什么我不能执行有store命令的pig脚本?
如何执行有store命令的pig脚本文件?

jtjikinw

jtjikinw1#

你的 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.openIterator 或者 PigServer.store 调用(即您显式地调用需要 STORE 行)。
至于你的第二个问题,你可能想看看pigrunner类。

相关问题