17

STOREコマンドを使用する Pig スクリプトを開発する場合、実行ごとに出力ディレクトリを削除する必要があります。そうしないと、スクリプトが停止して次のように表示されます。

2012-06-19 19:22:49,680 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 6000: Output Location Validation Failed for: 'hdfs://[server]/user/[user]/foo/bar More info to follow:
Output directory hdfs://[server]/user/[user]/foo/bar already exists

そのため、ディレクトリを自動的に削除するための in-Pig ソリューションを探しています。また、呼び出し時にディレクトリが存在しない場合でもチョークしないソリューションを探しています。

Pig Latin Reference で、シェル コマンド invoker fsを見つけました。残念ながら、何かエラーが発生すると、Pig スクリプトは壊れます。だから使えない

fs -rmr foo/bar

(つまり、再帰的に削除します)ディレクトリが存在しないと壊れるためです。一瞬使っていいのかと思った

fs -test -e foo/bar

これはテストであり、壊れてはならないか、そう思いました。testただし、Pigは、存在しないディレクトリでの のリターン コードを失敗コードとして再度解釈し、中断します。

私の問題に対処し、STOREコマンドのオプションのパラメーターOVERWRITEまたはFORCE_WRITEを提案する Pig プロジェクトのJIRA チケットがあります。とにかく、私は必要に迫られて Pig 0.8.1 を使用していますが、そのようなパラメーターはありません。

4

2 に答える 2

43

ついに私はgrokbaseで解決策を見つけました。解決策を見つけるのに時間がかかりすぎたので、ここでそれを再現して追加します。

ステートメントを使用して出力を保存するとします。

STORE Relation INTO 'foo/bar';

次に、ディレクトリを削除するために、スクリプトの開始時に呼び出すことができます

rmf foo/bar

いいえ ";" または、シェルコマンドであるため、引用符が必要です。

現在は再現できませんが、ある時点で、rmfがmap /reduceに干渉したとしか想定できないエラーメッセージ(ファイルの欠落に関する何か)が表示されました。したがって、関係宣言の前に呼び出しを行うことをお勧めします。SETの後、REGISTERとデフォルトは問題ないはずです。

例:

SET mapred.fairscheduler.pool 'inhouse';
REGISTER /usr/lib/pig/contrib/piggybank/java/piggybank.jar;
%default name 'foobar'
rmf foo/bar
Rel = LOAD 'something.tsv';
STORE Rel INTO 'foo/bar';
于 2012-06-20T09:32:59.293 に答える
2

fs コマンドを使用すると、これを行う方法がたくさんあります。個々のファイルについて、これをスクリプトの先頭に追加することになりました。

-- Delete file (won't work for output, which will be a directory
-- but will work for a file that gets copied or moved during the
-- the script.)
fs -touchz top_100
rm top_100

ディレクトリの場合

-- Delete dir
fs -rm -r out
于 2013-12-23T20:29:14.247 に答える