В 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.
Я хочу вернуть операции, соответствующие требованиям, например: idopedem соответствует ideope.
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;
Данные во втором примере (дата примечания уже в формате 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'