3

以下に示す埋め込み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';

このための埋め込まれた豚のコードは

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

これで、変更されたコードは正常に機能しています。だから今私の疑問は

  1. ストアコマンドを持っているpigスクリプトを実行できなかったのはなぜですか?

  2. ストアコマンドを持つpigスクリプトファイルを実行するにはどうすればよいですか?

4

1 に答える 1

4

次の理由でコードが機能していませPigServerん。を呼び出す.registerScript()と、デフォルトでPigServer、インタラクティブモードフラグがに設定さGruntParserれますfalsePigServerソースコードから:

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.storeSTORE

2番目の質問については、PigRunnerクラスを確認することをお勧めします。

于 2012-09-09T06:56:44.090 に答える