2012-02-24 63 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) 

但是,如果我想獲得這個什麼:

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

我該如何濾除重複的頻率值?

謝謝!

回答

1

你可以寫一個UDF來做到這一點,也許快一點吧,但你可以嘗試其中的一種。

 
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

嘿感謝您的回答,第二個例子的作品,但我不明白爲什麼,可能你請詳細一點嗎?謝謝! – Deleteman 2012-02-29 12:47:09

+0

GroupBy正在生成一個數據集,它將所有單詞按它們的頻率分組。它的輸出產生一組包含每個元組Bag的行。即{(word,freq),(word,freq)}。然後是每行(Bag)的後續FOREACH循環。 {}或嵌套塊允許我們對每一行應用一組特殊的過程。這僅在每行是數據集合(即Bag)時纔有用。我們在塊中使用的別名「data」來自我們在GroupBy中使用的別名。代表我們正在製作的每個包包。 – NerdyNick 2012-03-03 17:37:46