2012-02-12 25 views
16

Tôi cần trợ giúp về tập lệnh lợn này. Tôi chỉ nhận được một kỷ lục duy nhất. Tôi đang chọn 2 cột và thực hiện đếm (khác biệt) trên một cột khác trong khi cũng sử dụng mệnh đề tương tự để tìm mô tả cụ thể (desc).chọn số khác biệt bằng cách sử dụng lợn latin

Đây là sql của tôi với lợn Tôi đang cố gắng viết mã.

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

Trả lời

30

Bạn có thể GROUP trên từng lĩnh vực và sau đó đếm số lượng các yếu tố khác biệt trong mỗi nhóm với một cú pháp nested FOREACH:

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

Tôi nghĩ là hoàn hảo nên là unique_segments = DISTINCT C.segment; –

1

Bạn có thể xác định rõ hơn điều này như một vĩ mô:

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

Cách sử dụng:

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

Y = DISTINCT_COUNT(X, x);

Nếu bạn cần phải sử dụng nó trong một FOREACH thay vì sau đó là cách đơn giản nhất là một cái gì đó như:

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

Thử nghiệm trên lợn 12.

0

Nếu bạn không muốn để tính vào bất kỳ nhóm nào, bạn sử dụng nhóm này:

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

Điều này sẽ chỉ cung cấp cho bạn một số.

Các vấn đề liên quan