2017-02-10 2 views
0

Ich habe folgende Daten-Set, in dem ich brauche aus allen Datensätzen die Mindest Datum, um herauszufinden, für jeden Kunden (f1) und die Liste, um die Bücher, deren Datum größer als min DatumConditional Filter in PIG

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

min Datum für die erste Aufzeichnung ist 2015.01.01, also ich will die Aufzeichnungen> 2015-01-01 min Datum für den zweiten Datensatz ist 2015-05-01, also ich will die Datensätze> 2015-05-01

Kann mir bitte jemand helfen?

Antwort

2

Ermitteln Sie das Mindestdatum für jede Gruppierung, fügen Sie sie allen Datensätzen hinzu und verwenden Sie sie zum Filtern.

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

+0

Vielen Dank – satya