PigLatin では、2 つの異なる法則を持つ行を選択するために、2 回グループ化したいと考えています。
問題を説明するのが難しいので、ここに例を示します。自分の年齢 ($my_age) に最も近く、お金がたくさんある人の仕様を取得したいとします。
Relation A is four columns, (name, address, zipcode, age, money)
B = GROUP A BY (address, zipcode); # group by the address
-- generate the address, the person's age ...
C = FOREACH B GENERATE group, MIN($my_age - age) AS min_age, FLATTEN(A);
D = FILTER C BY min_age == age
--Then group by as to select the richest, group by fails :
E = GROUP D BY group; or E = GROUP D BY (address, zipcode);
-- The end would work
D = FOREACH E GENERATE group, MAX(money) AS max_money, FLATTEN(A);
F = FILTER C BY max_money == money;
私は最も裕福な人と最も近い人を同時にフィルタリングしようとしましたが、うまくいきません。
別のより現実的な例は次のとおりです。
次のような要求ファイルがあります:iddem、idopedem、datedem
次のような操作ファイルがあります:idope、labelope、dateope、idoftheday、infope
次のような要求に一致する操作を返したい: iidopem と一致する。
dateope は、datedem に最も近いものでなければなりません。
datedem - date_ope > 0 の場合、max(idoftheday) で操作を選択する必要があります。それ以外の場合は、min(idoftheday) で操作を選択する必要があります。
Relation A is 5 columns (idope,labelope,dateope,idoftheday,infope)
Relation B is 3 columns (iddem, idopedem, datedem)
C = JOIN A BY idope, B BY idopedem;
D = FOREACH E GENERATE iddem, idope, datedem, dateope, ABS(datedem - dateope) AS datedelta, idoftheday, infope;
E = GROUP C BY iddem;
F = FOREACH D GENERATE group, MIN(C.datedelta) AS deltamin, FLATTEN(D);
G = FILTER F BY deltamin == datedelta;
--Then I must group by another time as to select the min or max idoftheday
H = GROUP G BY group; --Does not work when dump
H = GROUP G BY iddem; --Does not work when dump
I = FOREACH H GENERATE group, (datedem - dateope >= 0 ? max(idoftheday) as idofdaysel : min(idoftheday) as idofdaysel), FLATTEN(D);
J = FILTER F BY idofdaysel == idoftheday;
DUMP J;
2番目の例のデータ(日付はすでにUnix形式になっていることに注意してください):次のような要求ファイルがあります:
1, 'ctr1', 1359460800000
2, 'ctr2', 1354363200000
次のような操作ファイルがあります:idope、labelope、dateope、idoftheday、infope
'ctr0','toto',1359460800000,1,'blabla0'
'ctr0','tata',1359460800000,2,'blabla1'
'ctr1','toto',1359460800000,1,'blabla2'
'ctr1','tata',1359460800000,2,'blabla3'
'ctr2','toto',1359460800000,1,'blabla4'
'ctr2','tata',1359460800000,2,'blabla5'
'ctr3','toto',1359460800000,1,'blabla6'
'ctr3','tata',1359460800000,2,'blabla7'
結果は次のようになります:
1, 'ctr1', 'tata',1359460800000,2,'blabla3'
2, 'ctr2', 'toto',1359460800000,1,'blabla4'