2012-02-12 14 views
16

Ho bisogno di aiuto con questo script suino. Sto solo ottenendo un singolo record. Sto selezionando 2 colonne e facendo un conteggio (distinto) su un altro mentre uso anche una clausola where like per trovare una descrizione particolare (desc).selezionare il conteggio distinto utilizzando porco latino

Ecco il mio sql con maiale Sto cercando di codice.

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

risposta

30

Si potrebbe GROUP su ogni dominio e poi contare il numero di elementi distinti in ogni gruppo con un nested FOREACH sintassi:

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

Penso che per essere perfetto dovrebbe essere unique_segments = DISTINCT C.segment; –

1

si può meglio definire questo come 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);                                  
} 

Utilizzo:

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

Y = DISTINCT_COUNT(X, x);

Se avete bisogno di usarlo in un FOREACH invece poi il modo più semplice è qualcosa di simile:

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

provata su Pig 12.

0

Se non si desidera per contare su qualsiasi gruppo, si utilizza questo:

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

Questo ti darà solo un numero.

Problemi correlati