Apache PIG-GROUP BY
estou a tentar alcançar a funcionalidade abaixo no porco. Tenho um conjunto de registos de amostras como este.
Note que a coluna efectivada é por vezes em branco e também diferente para o mesmo Utilizador.
Agora, como saída, quero um registo por cliente onde o eficaz é o máximo. Então, para o exemplo acima, eu quero que os registros destacados como mostrado abaixo.a forma como o faço actualmente usando O porco é este:
customerdata = LOAD 'customerdata' AS (CustomerID:chararray, CustomerName:chararray, Age:int, Gender:chararray, EffectiveDate:chararray);
--Group customer data by CustomerID
customerdata_grpd = GROUP customerdata BY CustomerID;
--From the grouped data, generate one record per CustomerID that has the maximum EffectiveDate.
customerdata_maxdate = FOREACH customerdata_grpd GENERATE group as CustID, MAX(customerdata.EffectiveDate) as MaxDate;
--Join the above with the original data so that we get the other details like CustomerName, Age etc.
joinwithoriginal = JOIN customerdata by (CustomerID, EffectiveDate), customerdata_maxdate by (CustID, MaxDate);
finaloutput = FOREACH joinwithoriginal GENERATE customerdata::CustomerID as CustomerID, CustomerName as CustomerName, Age as Age, Gender as gender, EffectiveDate as EffectiveDate;
Estou basicamente a agrupar os dados originais para encontrar o registo com o máximo de eficácia. Então eu me junto a esses registros 'agrupados' com o conjunto de dados originais novamente para obter esse mesmo registro com a data efetiva máxima, mas desta vez eu também vou obter dados adicionais como Nome Personalizado, Idade e sexo. Este conjunto de dados é enorme, por isso esta abordagem está a demorar muito tempo. Há uma abordagem melhor?
1
1 answers
Entrada :
1,John,28,M,1-Jan-15
1,John,28,M,1-Feb-15
1,John,28,M,
1,John,28,M,1-Mar-14
2,Jane,25,F,5-Mar-14
2,Jane,25,F,5-Jun-15
2,Jane,25,F,3-Feb-14
Programa Do Porco:
customer_data = LOAD 'customer_data.csv' USING PigStorage(',') AS (id:int,name:chararray,age:int,gender:chararray,effective_date:chararray);
customer_data_fmt = FOREACH customer_data GENERATE id..gender,ToDate(effective_date,'dd-MMM-yy') AS date, effective_date;
customer_data_grp_id = GROUP customer_data_fmt BY id;
req_data = FOREACH customer_data_grp_id {
customer_data_ordered = ORDER customer_data_fmt BY date DESC;
req_customer_data = LIMIT customer_data_ordered 1;
GENERATE FLATTEN(req_customer_data.id) AS id,
FLATTEN(req_customer_data.name) AS name,
FLATTEN(req_customer_data.gender) AS gender,
FLATTEN(req_customer_data.effective_date) AS effective_date;
};
Resultado :
(1,John,M,1-Feb-15)
(2,Jane,F,5-Jun-15)
4
Author: Murali Rao, 2015-10-02 00:17:41