3

入力ファイルをマップとして持っているとします。

sample.txt
[1#"anything",2#"something",3#"anotherthing"]
[2#"kish"]
[3#"mad"]
[4#"sun"]
[1#"moon"]
[1#"world"]

指定したキーの値がないので、ファイルに保存したくありません。Store into Relationship に含めることができる条件ステートメントはありますか? これを手伝ってください。以下は豚のスクリプトです。

A = LOAD 'sample.txt';
B = FOREACH A GENERATE $0#'5' AS temp;
C = FILTER B BY temp is not null;
-- It actually generates an empty part-r-X file
-- Is there any conditional statements i can include where if C is empty, Do not store ?
STORE C INTO '/user/logs/output';

ありがとう どこか間違っていますか?間違っている場合は修正してください。

4

1 に答える 1

1

プログラミング豚の第9章から、

Pig Latin はデータフロー言語です。汎用プログラミング言語とは異なり、ifや などの制御フロー構造は含まれませんfor

したがって、Pig だけを使用してこれを行うことは不可能です。

StoreFunccustomとcustom の組み合わせを使用してこれを達成できると言いたいのですが、OutputFormatそれではオーバーヘッドが大きくなりすぎるようです。

これを解決する 1 つの方法は、レコードが書き込まれない場合に出力ファイルを削除することです。埋め込みの Pigを使用することはそれほど難しくありません。たとえば、Python 埋め込みを使用すると、次のようになります。

from org.apache.pig.scripting import Pig

P = Pig.compile("""
A = load 'sample.txt';
B = foreach A generate $0#'5' AS temp;
C = filter B by temp is not null;
store C into 'output/foo/bar';
""")

bound = P.bind()
stats = bound.runSingle()

if not stats.isSuccessful():
    raise RuntimeError(stats.getErrorMessage())

result = stats.result('C')

if result.getNumberRecords() < 1:
    print 'Removing empty output directory'
    Pig.fs('rmr ' + result.getLocation())
于 2012-08-09T20:20:43.803 に答える