Pig - 在组中选择多个顶级记录

时间:2013-07-13 19:51:31

标签: apache-pig

我正在尝试从一个组中选择共享同一个键的多个记录,但不知道如何过滤它。

例如,使用以下数据:

  

D1,20130701,M1,V1

     

D1,20130701,M2,V2

     

D1,20130702,M1,V3

     

D1,20130703,M1,V4

     

D1,20130703,M2,V5

     

D2,20130701,M1,V1

     

D2,20130702,M1,V3

     

D2,20130703,M1,V4

加载声明:

A = load '/home/hduser/t.csv' 
        using PigStorage(',') 
        as (
            device:chararray, 
            dt:chararray, 
            metric:chararray, 
            value:chararray
        );

C = group A by (device, dt);

产生

  

(适用(D1,20130701),{(D1,20130701,M1,V1),(D1,20130701,M2,V2)})

     

((D1,20130702),{(D1,20130702,M1,V3)})

     

((D1,20130703),{(D1,20130703,M1,V4),(D1,20130703,M2,V5)})

     

(适用(D2,20130701),{(D2,20130701,M1,V1)})

     

((D2,20130702),{(D2,20130702,M1,V3)})

     

((D2,20130703),{(D2,20130703,M1,V4)})

问题是我应该做些什么来过滤掉我只得到粗体的行,逻辑是针对每个设备(D1 / D2 ......),给我一个日期最短的行?

如果我只是按设备分组:

B = group A by device;

我得到以下两行:

  

(D1,{(D1,20130701,M1,V1),(D1,20130701,M2,V2),(D1,20130702,M1,V3),(D1,20130703,M1,V4),(D1, 20130703,M2,V5)})

     

(D2,{(D2,20130701,M1,V1),(D2,20130702,M1,V3),(D2,20130703,M1,V4)})

但我不能在foreach中使用limit,因为每个设备的记录数量都是可变的。

有什么想法?对Pig来说还是个新人!

非常感谢。

1 个答案:

答案 0 :(得分:0)

一种方法是

 records = LOAD '/user/nubes/ncdc/micro-tab/top.txt' AS (
        device:chararray, 
        dt:int, 
        metric:chararray, 
        value:chararray);


 records_group = group records by (device);

 with_min = FOREACH records_group 
       GENERATE
       FLATTEN(records), MIN(records.dt) ;

 filterRecords = filter with_min by ( $1 == $4 );

i / p是

D1 20130701 M1 V1 D1 20130701 M2 V2

D1 20130702 M1 V3

D1 20130703 M1 V4

D1 20130703 M2 V5

D2 20130702 M1 V3

D2 20130703 M1 V4

输出

(D1,20130701,M1,V1,20130701)

(D1,20130701,M2,V2,20130701)

(D2,20130702,M1,V3,20130702)