我想在嵌入式 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");

现在修改后的代码工作正常。
所以现在我的怀疑是
  • 为什么我无法执行有 store 命令的 pig 脚本?
  • 如何执行带有 store 命令的 pig 脚本文件?
  • 最佳答案

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

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

    关于apache-pig - 在嵌入式 pig 程序中执行带有多个存储的 pig 脚本文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12297118/

    10-13 02:38