2017-08-30 48 views
0

我有一个像下面猪,算上array_element

1,1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|2|2|2|3|3|1|1|1|1|1|1|1|1|1|2|3,2016-17-08 
2,1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1,2016-07-10 
3,1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1,2017-06-04 

我要统计每个阵列中的1的号码,以便我能确定哪些产品具有1的

grunt> a= load 'product_details.csv' using PigStorage(',') as (product_id :int, event_id:chararray, date:chararray); 

我不次数最多的数据不明白我该如何计算数组中的元素?

+0

我会读每一个作为一个字符串,记号化通过管道断裂,并计数那些方式。 – duffymo

+0

我做了如下标记: grunt> b = foreach生成product_id,event_id,date,BagToString(TOKENIZE(event_id,'|'),',');它生成输出为: (1,1 | 1 | 1 | 1 | 1 | | 2 | 2 | 3 | 3 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 3,2016-17-08,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3,1,1,1,1,1,1,1,1 ,1,2,3) (2,1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1,2016-07-10,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1) ...... 现在计数函数如何计算1的黄色,因为计数功能只适用于包。 –

+0

我不知道那包东西是关于什么的。我知道如何标记一个字符串。你能否离开PIG,只用Java来开始? – duffymo

回答

0

将第二个字段中的字母标记化,然后使用产品和字母分组来获得计数。用字母1过滤所有产品,最后按desc顺序对其进行排序并获得最高记录以获得最高的产品1计数。

A = LOAD 'product_details.csv' using PigStorage(',') AS(col1:int,col2:chararray,col3:chararray); 
B = FOREACH A GENERATE col1,FLATTEN(TOKENIZE(col2,'|')) AS letter; 
C = GROUP B BY (col1,letter); 
D = FOREACH C GENERATE FLATTEN(group) as (product,letter),COUNT(B.letter) as total; 
E = FILTER D BY (letter == '1'); 
F = ORDER E BY total DESC; 
G = LIMIT F 1; 
DUMP G; 

输出

enter image description here

+0

嗨,非常感谢你:) –