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



我试图从一个组中选择多个共享同一密钥的记录,但不知道如何过滤。

例如,使用以下数据:

d120130701,M1,V1

d120130701,M2,V2

d120130702,M1,V3

d120130703,M1,V4

d120130703,M2,V5

d220130701,M1,V1

d220130702,M1,V3

d220130703,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);

生产:

((D120130701),{(D120130071,M1,V1),(D120130701M2,V2)})

((d120130702),{(d120130802,M1,V3)})

((d120130703),{(d120130403,M1,V4),(d120130303,M2,V5)})

((D220130701),{(D220130071,M1,V1)})

((d220130702),{(d220130802,M1,V3)})

((d220130703),{(d220130403,M1,V4)})

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

如果我只按设备分组:

B = group A by device;

我得到以下两行:

(D1,{(d120130701,M1,V1),(d120130071,M2,V2),(D120130702,M1,V3),(d220130703,M1,V4),(D220130703、M2,V5)})

(D2,{(d220130701,M1,V1),(d220130702,M1,V3),(D220130703,M1,V4)})

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

有什么想法吗?对Pig来说相当新鲜!

非常感谢。

一种方法是

 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 V1D1 20130701 M2 V2

D1 20130702 M1 V3

D1 20130703 M1 V4

D1 20130703 M2 V5

D2 20130702 M1 V3

D2 20130703 M1 V4

输出为

(d120130701,M1,v120130701)

(d120130701,M2,v2220130701)

(D220130702,M1,V320130702)

最新更新