2016-08-30 17 views
0

Pigでは、特定のIDを指定してavail_untilを次のレコードのavail_sinceに設定する必要があり、デフォルトでは9999-12-31に設定されます。 IDを与えられた。私はIDでデータを注文してからAvail_Sinceから始めていますが、それ以降は固執しています。私は、オーバー/ステッチ/リード/ラグ機能が必要かもしれないとは思いますが、わかりません。どんな助けでも大歓迎です!Apache PIG - 次のレコードの日付として現在の行の日付を設定します

あなたは、2倍のデータをロードするユニークなIDを生成するためにそれをランク付けし、第二のデータセットからのトップレコードをフィルター、再びそれをランク付けし、ユニークなIDのデータセットへの参加、から最後のレコードを取得する必要があります
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 

答えて

0

以下入社dataset.Seeとの最初のデータセットや労働組合、それをスクリプト

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; 

出力

enter image description here

0

私は、正確な結果を得るために@inuistive_mindのソリューションを拡張します。..

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; 

手順は、このヒントが最終結果にあなたを助ける

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.. 

希望を追加する必要があります。..

関連する問題