2012-02-24 4 views
0

私はPigLatinに入るために始めていると私は疑問を持っている...右フィルターレコード - PigLatin

今私はワードカウント、古典的な例で働いている私は、いくつかの電子書籍を処理します単語のリストと各単語が現れる回数を取得します。

そのデータをブタの入力データとして使用して、各単語が表示される回数でソートし、最も一般的な5つの単語を取得します。これまでのところ、とても良いですが、私の問題ですが、今では5つの最も一般的な言葉を手に入れたいと思いますが、それは異なる回数表示されます。私は少し良く説明しましょう:

ワードカウントジョブにこの出力を想像:

(hey, 1) 
(hello, 10) 
(my, 2) 
(cat, 1) 
(eat, 4) 
(mom, 10) 
(house, 10) 

私はその後、兵卒のシェル上で次の操作を実行します。

data = load 'file' as (word, freq); 
srtd = order data by freq; 
lmtd = limit srtd 3; 
dump lmtd; 

私は思い出力

(hello, 10) 
(mom, 10) 
(house, 10) 

しかし、私はこの取得したい場合はどのような:取得され

0を
(hello, 10) 
(eat, 4) 
(my, 2) 

繰り返し周波数の値をフィルタリングするにはどうすればよいですか?

ありがとうございます!

答えて

1

これを実行するためにUDFを書くこともできますが、MRの方が少し速いかもしれませんが、これらのいずれかを試すことができます。

 
data = load 'file' as (word, freq); 
counts = GROUP data BY freq; 
countsLimited = FOREACH counts { 
    word = TOP(1, 2, data); 
    GENERATE FLATTEN(word); 
} 

または

 
data = load 'file' as (word, freq); 
counts = GROUP data BY freq; 
countsLimited = FOREACH counts { 
    word = LIMIT data 1; 
    GENERATE word; 
} 
+0

ちょっと答えのためのおかげで、2番目の例では動作しますが、私は理由を理解していないが、あなたのもう少し手の込んだしてくださいだろうか?ありがとう! – Deleteman

+0

GroupByは、すべての単語をそのFreqでグループ化しているデータセットを作成しています。その出力は、タプルの袋をそれぞれ含む行の集合を生成する。すなわち{(単語、freq)、(単語、freq)}。その後、各行(バッグ)の後続のFOREACHループ。 {}またはネストされたブロックを使用すると、各行に特別な一連のプロシージャを適用できます。これは、各行がデータの集合、すなわちバッグである場合にのみ有効です。ブロック内で使用する別名「データ」は、GroupByで使用したエイリアスに由来します。私たちが取り組んでいる各バッグを表しています。 – NerdyNick