2014-03-31 45 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)})