2014-03-31 46 views
0

我想寫一個UDF,它將一個元組作爲輸入並返回一個數據包作爲輸出。我對PIG很新。請幫忙。我有的例子是UPPER.java類的例子。返回一個數據庫在PIG給出一個元組

UDF應該做什麼的示例 輸入是說< 8,9,1,8,9>輸出應該是< {8,2} {9,2} {1,1}> 8出現2次,9次也是1次出現一次。

+0

更具體。你想讓你的UDF用元組做什麼? DataBag與它有什麼關係? –

+0

輸入是<8,9,1,8,9>輸出應該是<{8,2} {9,2} {1,1}> 8出現2次,9也是,1出現一次。所以這就像一個頻率計數。我需要使用UDF來做到這一點 – user3011727

+0

這是提出問題的重要信息。試着寫你的代碼,然後我們可以看看你有什麼問題。 –

回答

0

我找到了解決方案。


步驟1:加載輸入文件

input_data= load '/idn/home/ksing143/tuple_related_data/tuple_frequency.txt' USING PigStorage() AS ip_tuple:tuple(a:int, b:int, c:int, d:int, e:int); 

結果:

((8,9,1,8,9)) 



步驟2:壓平所述輸入元組

ip_flattened = foreach input_data generate FLATTEN($0); 



步驟3:轉換爲袋

ip_tobag = foreach ip_flattened generate TOBAG(ip_tuple::a,ip_tuple::b,ip_tuple::c,ip_tuple::d,ip_tuple::e); 

結果:

({(8),(9),(1),(8),(9)}) 



步驟4:壓扁袋

ip_tobag_flattened = foreach ip_tobag generate FLATTEN($0); 

結果:

(8) 
(9) 
(1) 
(8) 
(9) 



步驟5:執行分組,然後計數

ip_grouped = group ip_tobag_flattened BY $0; 
ip_out = foreach ip_grouped generate group, COUNT($1); 

結果:

(1,1) 
(8,2) 
(9,2) 


步驟6:將輸出TOBAG轉換爲我們想要以袋形式輸出。

ip_output_bag = foreach ip_out generate TOBAG($0,$1); 

結果:

({(1),(1)}) 
({(8),(2)}) 
({(9),(2)})