2017-08-30 40 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

嗨,非常感謝你:) –