2016-08-30 3 views
0

In Pig, ich habe die Anforderung, avail_until als nächste Datensätze 'avail_since gegeben eine bestimmte ID und Standard es 9999-12-31 für den letzten Datensatz von a gegebene ID. Ich beginne damit, die Daten per ID und dann Avail_Since zu bestellen, stehe aber danach fest. Ich denke, ich brauche vielleicht eine Über/Stich/Lead/Lag-Funktion, aber nicht sicher. Jede Hilfe würde sehr geschätzt werden!Apache PIG - setze das Datum der aktuellen Zeile als das Datum des nächsten Datensatzes

Input Data: 

ID  AVAIL_SINCE AVAIL_UNTIL 
1  19-Jan-00  31-Dec-99 
1  11-Jun-00  31-Dec-99 
1  4-Aug-00  31-Dec-99 
1  19-May-01  31-Dec-99 
2  5-May-02  31-Dec-99 
2  8-Apr-03  31-Dec-99 
3  10-Jun-00  31-Dec-99 
3  31-Oct-00  31-Dec-99 
3  29-Dec-00  31-Dec-99 

Required Result: 

ID  AVAIL_SINCE AVAIL_UNTIL 
1  19-Jan-00  11-Jun-00 
1  11-Jun-00  4-Aug-00 
1  4-Aug-00  19-May-01 
1  19-May-01  31-Dec-99 
2  5-May-02  8-Apr-03 
2  8-Apr-03  31-Dec-99 
3  10-Jun-00  31-Oct-00 
3  31-Oct-00  29-Dec-00 
3  29-Dec-00  31-Dec-99 

Antwort

0

Sie werden die Daten zweimal geladen werden müssen, ordnen sie eindeutiges IDs zu erzeugen, Top-Datensätze aus dem zweiten Datensatz filtern, es Rang wieder, dann die Datensätze auf dem eindeutigen IDs verbinden, den letzten Datensatz aus der get erstes Daten-Set und Vereinigung mit dem verbundenen dataset.See unter

Script

A = LOAD 'test9.txt' USING PigStorage('\t') as (A1:int,A2:chararray,A3:chararray); 
B = LOAD 'test9.txt' USING PigStorage('\t') as (B1:int,B2:chararray,B3:chararray); 
RankA = rank A; 
RankB = rank B; 

BB = FILTER RankB by (rank_B > 1); 
BB_New = rank BB; 

AB = JOIN RankA by rank_A,BB_New by rank_BB; 
AB_ALL = foreach AB GENERATE RankA::A1,RankA::A2,BB_New::B2; 
A_Order = ORDER RankA by rank_A desc; 
A_Last = LIMIT A_Order 1; 
A_Fields = foreach A_Last generate $1,$2,$3; 

FINAL = UNION A_Fields,AB_ALL; 
FINALORDER = ORDER FINAL BY $0; 
DUMP FINALORDER; 

Ausgabe

enter image description here

0

ich die Lösung von @inuistive_mind verlängern wird das genaue Ergebnis zu erhalten ..

A = LOAD 'test9.txt' USING PigStorage('\t') as (A1:int,A2:chararray,A3:chararray); 
B = LOAD 'test9.txt' USING PigStorage('\t') as (B1:int,B2:chararray,B3:chararray); 
RankA = rank A; 
RankB = rank B; 

BB = FILTER RankB by (rank_B > 1); 
BB_New = rank BB; 

AB = JOIN RankA by rank_A,BB_New by rank_BB; 
AB_ALL = foreach AB GENERATE RankA::A1,RankA::A2,BB_New::B2; 
A_Order = ORDER RankA by rank_A desc; 
A_Last = LIMIT A_Order 1; 
A_Fields = foreach A_Last generate $1,$2,$3; 

FINAL = UNION A_Fields,AB_ALL; 
FINALORDER = ORDER FINAL BY $0; 

Schritte müssen

Step-1 F1 = rank FINALORDER.. 
Step-2 Group BY A1; ie ID. 
Step-3 F2 = foreach byid generate MAX(FINAL.rank_FINAL) AS mx, '31-Dec-99' as AVAIL_UNTIL1. 
Step-4 F3 = join F1 by rank_FINALORDER with F2 by mx as left outer join. 
Step-5 F4 generated the required column with (AVAIL_UNTIL1 is null)? F1::A3 : F2::AVAIL_UNTIL1 as AVAIL_UNTIL.. 

Hoffnung dieser Hinweis wird Ihnen helfen, zum Endergebnis hinzugefügt werden ..

Verwandte Themen