[〜#〜] 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
だから私はディレクトリを自動的に削除するための豚の解決策を探しています、またディレクトリが存在しない場合にチョークしないものも呼び出し時間。
Pig Latin Referenceで、シェルコマンドの呼び出し元fsを見つけました。残念ながら、Pigスクリプトは何かがエラーを生成するたびに壊れます。だから私は使用できません
fs -rmr foo/bar
(つまり、再帰的に削除します)ディレクトリが存在しない場合は壊れるためです。ちょっと使ってみようかな
fs -test -e foo/bar
これはテストで、壊れてはならないので、私は思った。ただし、Pigは、存在しないディレクトリのtest
の戻りコードを失敗コードとして再度解釈し、中断します。
私の問題に対処し、オプションのパラメーターを提案するPigプロジェクトの JIRAチケット があります[〜#〜] overwrite [〜#〜]またはFORCE_WRITE = [〜#〜] store [〜#〜]コマンドの場合。とにかく、私は必然的にPig 0.8.1を使用しており、そのようなパラメーターはありません。
ついに私は grokbase で解決策を見つけました。解決策を見つけるのに時間がかかりすぎたので、ここで再現して追加します。
次のステートメントを使用して出力を保存するとします。
STORE Relation INTO 'foo/bar';
次に、ディレクトリを削除するために、スクリプトの開始時に呼び出すことができます
rmf foo/bar
番号 ";"それはシェルコマンドなので、引用符が必要です。
現在は再現できませんが、ある時点でrmfがマップに干渉したとしか想定できないエラーメッセージ(ファイルの欠落に関する何か)が表示されました/ 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';
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