我试图从一个组中选择多个共享同一密钥的记录,但不知道如何过滤。
例如,使用以下数据:
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)