PIG

2017-04-04 11 views
-2

スキーマのデータからMIN EFF_DTとMAX_CANC_dtを取る:PIG

TYP|ID|RECORD|SEX|EFF_DT|CANC_DT 

DMF|1234567|98765432|M|2011-08-30|9999-12-31 
DMF|1234567|98765432|M|2011-04-30|9999-12-31 
DMF|1234567|98765432|M|2011-04-30|9999-12-31 

は、私はこのような複数のレコードを持っていると仮定します。私は最小eff_dtと最大キャンセル日を持つレコードを表示したいだけです。

私はちょうどこの1つのレコード

DMF|1234567|98765432|M|2011-04-30|9999-12-31 

を表示するには、

答えて

0

が最小eff_dtとmax canc_dtを取得し、あなたは関係

B = GROUP A ALL; 
X = FOREACH B GENERATE MIN(A.EFF_DT); 
Y = FOREACH B GENERATE MAX(A.CANC_DT); 

C = FILTER A BY ((EFF_DT == X.$0) AND (CANC_DT == Y.$0)); 
D = DISTINCT C; 
DUMP D; 
を持ってrelation.Assumingをフィルタリングするためにそれを使用するありがとう
+0

これは、私がこのような複数のレコードを異なる最小eff_dtと最大canc_dtで使用している場合に動作しますか? – pd123

+0

@ pd123自分で試してみてください –

+0

ありがとうございました。働いた。また新しい方法を考え出しました。 – pd123

0

このデータがあるとします(ここでサンプル):

DMF|1234567|98765432|M|2011-08-30|9999-12-31 
DMF|1234567|98765432|M|2011-04-30|9999-12-31 
DMF|1234567|98765432|M|2011-04-30|9999-12-31 
DMX|1234567|98765432|M|2011-12-30|9999-12-31 
DMX|1234567|98765432|M|2011-04-30|9999-12-31 
DMX|1234567|98765432|M|2011-04-01|9999-12-31 

次の手順を実行:あなたは、charraryに日時を変更する必要がある場合

-- 1. Read data, if you have not 
A = load 'data.txt' using PigStorage('|') as (typ: chararray, id:chararray, record:chararray, sex:chararray, eff_dt:datetime, canc_dt:datetime); 

-- 2. Group data by the attribute you like to, in this case it is TYP 
grouped = group A by typ; 

-- 3. Now, generate MIN/MAX for each group. Also, only keep relevant fields 
min_max = foreach grouped generate group, MIN(A.eff_dt) as min_eff_dt, MAX(A.canc_dt) as max_canc_dt; 

-- 
dump min_max; 
(DMF,2011-04-30T00:00:00.000Z,9999-12-31T00:00:00.000Z) 
(DMX,2011-04-01T00:00:00.000Z,9999-12-31T00:00:00.000Z) 

を。

注:ロードステップを除いて、これを行う方法はいくつかありますが、GROUPとFOREACHの2つのステップで目的の結果が得られます。