hadoop - spark - pig script
seleccione conteo distinto usando cerdo latino (2)
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).
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;
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 usarlo en FOREACH
entonces la forma más fácil es algo como:
...GENERATE COUNT(Distinct(x))...
Probado en Pig 12.
Podría agrupar en cada dominio y luego contar el número de elementos distintos en cada grupo con una sintaxis FOREACH anidada :
D = group C by domain;
E = foreach D {
unique_segments = DISTINCT C.segment;
generate group, COUNT(unique_segments) as segment_cnt;
};