0

次のように、豚のラテン語で単純な単語カウンターを実行しようとしています:

lines = LOAD 'SOME_FILES' using PigStorage('#') as (line:chararray);
word = FILTER lines BY (line matches '.*SOME_VALUE.*');

SOME_VALUE検索で見つかった の数をカウントしたいSOME_FILESので、予想される出力は次のようになります。

(SOME_VALUE,xxxx)

ここで、 は見つかっxxxxた総数です。SOME_VALUE

複数の値を検索して、上記のようにそれぞれを出力するにはどうすればよいですか?

4

1 に答える 1

1

あなたがすべきことは、各行をトークンの袋に分割してから、それを分割するFLATTENことです。次に、単語に対して a を実行してGROUP、各単語のすべての出現を独自の行にプルできます。結果のバッグを実行するCOUNTと、ドキュメント内のすべての単語の合計数が得られます。

これは次のようになります。

B = FOREACH lines GENERATE FLATTEN(TOKENIZE(line)) ;
C = GROUP B BY $0 ;
D = FOREACH C GENERATE group AS word, COUNT(B) AS count ;

各ステップの動作がわからない場合は、 と を使用DESCRIBEDUMPて何が起こっているかを視覚化できます。


更新:結果をフィルタリングして、必要な文字列のみを含める場合は、次のようにします。

E = FILTER D BY (word == 'foo') OR 
                (word == 'bar') OR 
                (word == 'etc') ;

-- Another way...
E = FILTER D BY (word matches 'foo|bar|etc') ;

ただし、これを と の間Bに行うこともできるCため、COUNT必要のない s は実行しません。

于 2013-09-05T17:02:28.007 に答える