2012-02-12 15 views
16

Potrzebuję pomocy w tym skrypcie świni. Właśnie dostaję pojedynczą płytę. Wybieram 2 kolumny i robię licznik (odrębny) na innym, jednocześnie używając klauzuli where like, aby znaleźć konkretny opis (desc).wybierz liczbę różną używając świni łacińskiej

Oto mój sql ze świnią próbuję kodować.

/* 
    For example in sql: 
    select domain, count(distinct(segment)) as segment_cnt 
    from table 
    where desc='ABC123' 
    group by domain 
    order by segment_count desc; 
    */ 

    A = LOAD 'myoutputfile' USING PigStorage('\u0005') 
      AS (
       domain:chararray, 
       segment:chararray, 
       desc:chararray 
       ); 
B = filter A by (desc=='ABC123'); 
C = foreach B generate domain, segment; 
D = DISTINCT C; 
E = group D all; 
F = foreach E generate group, COUNT(D) as segment_cnt; 
G = order F by segment_cnt DESC; 

Odpowiedz

30

Mogłabyś GROUP na każdej domeny, a następnie policzyć liczbę odrębnych elementów w każdej grupie z nested FOREACH składnię:

D = group C by domain; 
E = foreach D { 
    unique_segments = DISTINCT C.segment; 
    generate group, COUNT(unique_segments) as segment_cnt; 
}; 
+5

Myślę, że być doskonały powinien być unique_segments = DISTINCT C.segment; –

1

można lepiej określić to jako makro:

DEFINE DISTINCT_COUNT(A, c) RETURNS dist { 
    temp = FOREACH $A GENERATE $c;                                      
    dist = DISTINCT temp;                                        
    groupAll = GROUP dist ALL;                                       
    $dist = FOREACH groupAll GENERATE COUNT(dist);                                  
} 

Użycie:

X = LOAD 'data' AS (x: int);

Y = DISTINCT_COUNT(X, x);

Jeśli trzeba użyć go w FOREACH zamiast wtedy najłatwiej jest coś takiego:

...GENERATE COUNT(Distinct(x))...

Testowane na Pig 12.

0

Jeśli nie chcesz Aby liczyć na dowolną grupę, użyj tego:

G = FOREACH (GROUP A ALL){ 
unique = DISTINCT A.field; 
GENERATE COUNT(unique) AS ct; 
}; 

To da ci tylko numer.

Powiązane problemy