2012-06-19 9 views
14

STOREコマンドを使用して豚のスクリプトを開発するとき、私はすべての実行のための出力ディレクトリを削除する必要がありますまたはスクリプトが停止しています:PigでHDFSにSTORE(上書き)する方法は?

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 

だから私はへのイン豚ソリューションを探していますディレクトリを自動的に削除します。また、ディレクトリがコール時に存在しない場合は、チョークしません。

豚ラテン語のリファレンスでは、シェルコマンドの呼び出し元fsが見つかりました。残念ながら、何かエラーが発生すると、Pigスクリプトは中断します。だから私は使用できません。ディレクトリが存在しないと壊れてしまいますので、使用できません。再利用することはできません。再帰的に削除してください。現時点では私は私がテストされ、ブレークまたはそう私は思っていないはずである

fs -test -e foo/bar 

を使用することを考えました。しかし、Pigは、存在しないディレクトリ上のtestのリターンコードを失敗コードとして再度解釈し、中断します。

は私の問題に対処し、STOREコマンドのオプションパラメータOVERWRITEまたはFORCE_WRITEを示唆豚のプロジェクトのためのJIRA ticketがあります。とにかく、私はPig 0.8.1を必要に応じて使用しています。そのようなパラメータはありません。

答えて

40

最後に、grokbaseの解決策が見つかりました。解決策が見つからないので、私はここでそれを再現して追加します。 「;」

は、スクリプト

rmf foo/bar 

ないの開始時に呼び出すことができ、あなたはディレクトリを削除するために、

STORE Relation INTO 'foo/bar'; 

Thenステートメントを使用して、出力を保存したいとしシェルコマンドであるため、引用符を必要としません。

私はこれを再現することはできませんが、ある時点では、私はそのファイルが見つからないというエラーメッセージが表示されます。rmfはmap/reduceで干渉しました。ですから、関係宣言の前にコールを置くことをお勧めします。 SETの後、REGISTERsとデフォルトはうまくいくはずです。

例:

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'; 
+0

の場合、これは確かにいいですが、それはアトミックではありません。個々のファイルのために、私は私のスクリプトの先頭にこれを追加すること巻き上げます。私はむしろ3つのステップでそれをやります:1) 'foobar-tmp'に格納する2)rmf foo/bar 3)mv 'foobar-tmp' to foo/bar –

+2

@MiguelPing:私の初期の問題だが、 'foo/bar'の代わりに' foobar-tmp'のために。最初に格納すると、暫定的にマップ/リダクションに起因するわかりにくいエラーが発生する可能性があります。あなたのソリューションがあなたの側で動作する場合は、サンプルスクリプトを使って答えに変えて、豚のバージョン番号を提供できますか? – valid

+0

@ invalid私のソリューションはあなたのものと似ていますが、私はちょうど 'rmf'と' STORE'(例えば、例外)の間に何かが起きたときにデータを失わないことを保証するための追加ステップを追加しました。豚のスクリプトはいつでも失敗する可能性があるので、私の解決策はそれほど重要ではありませんが、少なくともデータを失う危険はありません。 –

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 
関連する問題