pig-选择组中的多个顶级记录

xienkqul  于 2021-06-24  发布在  Pig
关注(0)|答案(1)|浏览(364)

我试图从一个组中选择共享同一密钥的多个记录,但不确定如何筛选此记录。
例如,使用以下数据:
D120130701,m1,v1
D120130701、m2、v2
D120130702、m1、v3
D120130703,m1,v4
D120130703,m2,v5
D220130701、m1、v1
D220130702、m1、v3
D220130703、m1、v4
以及load语句:

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

C = group A by (device, dt);

生产:
((D120130701),{(D120130701,m1,v1),(D120130701,m2,v2)})
((D120130702),{(D120130702,m1,v3)})
((D120130703),{(D120130703,m1,v4),(D120130703,m2,v5)})
((D220130701),{(D220130701,m1,v1)})
((D220130702),{(D220130702,m1,v3)})
((D220130703),{(D220130703,m1,v4)})
问题是我应该做什么来过滤掉这样我只得到粗体的行,逻辑是每个设备(d1/d2…),给我最低日期的行?
如果我只按设备分组:

B = group A by device;

我得到以下两行:
(d1,{(D120130701,m1,v1),(D120130701,m2,v2),(D120130702,m1,v3),(D120130703,m1,v4),(D120130703,m2,v5)})
(d2,{(D220130701,m1,v1),(D220130702,m1,v3),(D220130703,m1,v4)})
但是我不能在foreach中使用limit,因为每个设备的记录数是可变的。
有什么想法吗?对Pig来说相当新鲜!
非常感谢。

xxhby3vn

xxhby3vn1#

一种方法是

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第3版
d1 20130703 m1第4版
d1 20130703平方米v5
d2 20130702 m1第3版
d2 20130703 m1第4版
输出为
(D120130701、m1、V120130701)
(D120130701,m2,V220130701)
(D220130702,m1,V320130702)

相关问题