web-dev-qa-db-fra.com

porc le compte distinct à l'aide de porc latin

J'ai besoin d'aide avec ce script de cochon. Je viens de recevoir un seul disque. Je sélectionne 2 colonnes et fais un décompte (distinct) sur un autre tout en utilisant également une clause where like pour trouver une description particulière (desc).

Voici mon sql avec le porc que j'essaye de coder.

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

Vous pouvez GROUPER sur chaque domaine, puis compter le nombre d'éléments distincts dans chaque groupe avec une syntaxe imbriquée FOREACH :

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

Vous pouvez mieux définir cela comme une 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);                                                                                                                                      
}

Usage:

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

Y = DISTINCT_COUNT(X, x);

Si vous avez besoin de l'utiliser dans un FOREACHalors le moyen le plus simple est quelque chose comme:

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

Testé sur le cochon 12.

1
reim

Si vous ne voulez pas compter sur un groupe, utilisez ceci:

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

Cela vous donnera juste un numéro. 

0
LAS