PIG

时间:2017-02-10 01:16:46

标签: apache-pig

我有以下数据集,其中我需要找出每个客户(f1)的所有记录中的最小日期,并列出日期大于最小日期的记录

f1   f2  f3
101 JOE 2015-01-01
101 JOE 2015-31-01
101 JOE 2016-01-01
101 JOE 2016-04-01
101 JOE 2016-09-01
101 JOE 2016-31-01
101 JOE 2017-01-01
102 KAT 2015-21-01
102 KAT 2015-05-01
102 KAT 2016-02-01
102 KAT 2016-04-01
102 KAT 2016-09-01
102 KAT 2016-31-01
102 KAT 2017-02-01

A = LOAD 'data.txt' AS (f1:int, f2:chararray, f3:date);
G = GROUP A BY (f1, f2);
DUMP G;

((101,JOE),{(101,JOE,2015-01-01),(101,JOE,2015-31-01),(101,JOE,2016-01-01),(101,JOE,2016-04-01),(101,JOE,2016-09-01),(101,JOE,2016-31-01),(101,JOE,2017-01-01)}
((102,KAT),{(102,KAT,2015-02-01),(102,KAT,2015-05-01),(102,KAT,2016-02-01),(102,KAT,2016-04-01),(102,KAT,2016-09-01),(102,KAT,2016-31-01),(102,KAT,2017-02-01)}


Output:

101,JOE,2015-31-01
101,JOE,2016-01-01
101,JOE,2016-04-01
101,JOE,2016-09-01
101,JOE,2016-31-01
101,JOE,2017-01-01
102,KAT,2015-21-01
102,KAT,2016-02-01
102,KAT,2016-04-01
102,KAT,2016-09-01
102,KAT,2016-31-01
102,KAT,2017-02-01

第一条记录的最小日期是2015-01-01,所以我想要记录> 2015年1月1日 第二条记录的最小日期是2015-05-01,所以我想要记录> 2015年5月1日

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

获取每个分组的最短日期,将其添加到所有记录中,然后使用它进行过滤。

A = LOAD 'test30.txt' USING PigStorage(' ') AS (f1:int, f2:chararray, f3:chararray);
B = FOREACH A GENERATE f1,f2,ToDate(f3,'yyyy-MM-dd') as f3;
G = GROUP A BY (f1, f2);
M = FOREACH G GENERATE FLATTEN(A),MIN(A.f3) AS min_date;
F = FOREACH (FILTER M BY f3 > min_date) GENERATE f1,f2,f3;
DUMP F;

Output