복붙노트

[HADOOP] 돼지 라틴어를 사용하여 수를 선택하십시오.

HADOOP

돼지 라틴어를 사용하여 수를 선택하십시오.

이 돼지 스크립트에 도움이 필요해. 나는 단지 하나의 기록을 얻고있다. 두 칼럼을 선택하고 또 다른 칼럼에서 count (distinct)를하고 where 절을 사용하여 특정 설명 (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;

해결법

  1. ==============================

    1.각 도메인에서 GROUP을 수행 한 다음 중첩 된 FOREACH 구문을 사용하여 각 그룹에서 고유 한 요소의 수를 계산할 수 있습니다.

    각 도메인에서 GROUP을 수행 한 다음 중첩 된 FOREACH 구문을 사용하여 각 그룹에서 고유 한 요소의 수를 계산할 수 있습니다.

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

    2.이 매크로를 매크로로 더 잘 정의 할 수 있습니다.

    이 매크로를 매크로로 더 잘 정의 할 수 있습니다.

    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 (고유 (x)) ...

    돼지 12 테스트.

  3. ==============================

    3.당신이 어떤 그룹에 의지하고 싶지 않다면, 당신은 이것을 사용합니다 :

    당신이 어떤 그룹에 의지하고 싶지 않다면, 당신은 이것을 사용합니다 :

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

    이것은 단지 당신에게 숫자를 줄 것입니다.

  4. from https://stackoverflow.com/questions/9247296/select-count-distinct-using-pig-latin by cc-by-sa and MIT license