выберите различное число используя латинскую свинью - PullRequest
16 голосов
/ 12 февраля 2012

Мне нужна помощь с этим сценарием свиньи. Я просто получаю одну запись. Я выбираю 2 столбца и выполняю подсчет (отличный) для другого, а также использую предложение where like для поиска конкретного описания (desc).

Вот мой sql с поросенком, который я пытаюсь закодировать.

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

Ответы [ 3 ]

33 голосов
/ 12 февраля 2012

Вы можете группировать в каждом домене, а затем подсчитывать количество отдельных элементов в каждой группе с помощью вложенного синтаксиса FOREACH :

D = group C by domain;
E = foreach D { 
    unique_segments = DISTINCT C.segment;
    generate group, COUNT(unique_segments) as segment_cnt;
};
1 голос
/ 09 февраля 2015

Вы можете лучше определить это как макрос:

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

Использование:

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

Y = DISTINCT_COUNT(X, x);

Если вам нужно вместо этого использовать FOREACH, то самый простой способ это что-то вроде:

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

Проверено на Свинье 12.

0 голосов
/ 12 января 2018

Если вы не хотите рассчитывать ни на какую группу, вы используете это:

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

Это просто даст вам номер.

...