2012-02-12 22 views
16

Necesito ayuda con este script de cerdo. Solo estoy obteniendo un solo registro. Estoy seleccionando 2 columnas y haciendo un conteo (distinto) en otro mientras también uso una cláusula where like para encontrar una descripción particular (desc).seleccione count distinct usando pig latin

Aquí está mi sql con cerdo Estoy tratando de codificar.

/* 
    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; 

Respuesta

30

puede agrupar en cada dominio y luego contar el número de elementos distintos en cada grupo con una sintaxis nested FOREACH:

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

Creo que es perfecto, debería ser unique_segments = DISTINCT C.segment; –

1

Usted puede definir mejor esto como una macro:

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);                                  
} 

Uso:

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

Y = DISTINCT_COUNT(X, x);

Si necesita utilizarlo en un FOREACH entonces la manera más fácil es algo así como:

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

probado en cerdo 12.

0

Si no desea para contar con cualquier grupo, use esto:

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

Esto solo le dará un número.

Cuestiones relacionadas