2011-02-08 9 views
7

Powiedzmy Mam zestaw danych: recenzje restauracjiCzy mogę generować zagnieżdżone torby za pomocą zagnieżdżonych instrukcji FOREACH w Pig Latin?

User,City,Restaurant,Rating 
Jim,New York,Mecurials,3 
Jim,New York,Whapme,4.5 
Jim,London,Pint Size,2 
Lisa,London,Pint Size,4 
Lisa,London,Rabbit Whole,3.5 

I chcę stworzyć listę według użytkownikiem i miasta średniej recenzji. To znaczy. Wyjście:

User,City,AverageRating 
Jim,New York,3.75 
Jim,London,2 
Lisa,London,3.75 

Mógłbym napisać skrypt Pig następująco:

Data = LOAD 'data.txt' USING PigStorage(',') AS (
    user:chararray, city:chararray, restaurant:charray, rating:float 
); 

PerUserCity = GROUP Data BY (user, city); 

ResultSet = FOREACH PerUserCity { 
    GENERATE group.user, group.city, AVG(Data.rating); 
} 

Jednak jestem ciekaw, czy mam może najpierw grupa grupa wyższy poziom (użytkownicy), a następnie sub grupy do następnego poziomu (miasta) później: tzn

PerUser = GROUP Data BY user; 

Intermediate = FOREACH PerUser { 
    B = GROUP Data BY city; 
    GENERATE group AS user, B; 
} 

uzyskać:

Error during parsing. 
Invalid alias: GROUP in { 
    group: chararray, 
    Data: { 
    user: chararray, 
    city: chararray, 
    restaurant: chararray, 
    rating: float 
    } 
} 

Czy ktoś próbował tego z powodzeniem? Czy po prostu nie można się zgrupować w KAŻDYM KRAJU?

Moim celem jest, aby zrobić coś takiego:

ResultSet = FOREACH PerUser { 
    FOREACH City { 
     GENERATE user, city, AVG(City.rating) 
    } 
} 

Odpowiedz

8

Obecnie dozwolone operacje są DISTINCT, FILTER, LIMIT, a ORDER BY Wewnątrz FOREACH.

Na razie grupowanie bezpośrednio przez (użytkownika, miasto) jest dobrym sposobem na robienie tego, co powiedziałeś.

+0

linku złamał człowiek –

2

Informacje o wersji dla wersji 0.10 wersji Pig sugerują, że zagnieżdżone operacje FOREACH to now supported.

+0

Dziękuję. Dlaczego dwa elementy GENERATE są wymagane w wewnętrznym bloku? –

+0

Wycofuję moją sugestię. Informacje o wersji sugerują, że można to zrobić, ale nie mogę tego uruchomić. – chriswynnyk

0
awdata = load 'data' using PigStorage(',') as (user:chararray , city:chararray , restaurant:chararray , rating:float); 
data = filter rawdata by user != 'User'; 

groupbyusercity = group data by (user,city); 

--describe groupbyusercity; 
--groupbyusercity: {group: (user: chararray,city: chararray),data: {(user: chararray,city: chararray,restaurant: chararray,rating: float)}} 

average = foreach groupbyusercity { 
    generate group.user,group.city,AVG(data.rating); 
} 

dump average; 
1

Spróbuj tego:

Records = load 'data_rating.txt' using PigStorage(',') as (user:chararray, city:chararray, restaurant:chararray, rating:float); 
grpRecs = group Records By (user,city); 
avgRating_Byuser_perCity = foreach grpRecs generate AVG(Records.rating) as average; 
Result = foreach avgRating_Byuser_perCity generate flatten(group), average; 
+2

Powinieneś dodać opis tego, co ten kod wykonuje i jak to robi. –

+0

To jest złe ... Powinno być Records = load 'data_rating.txt "za pomocą PigStorage (", ") as (użytkownik: chararray, miasto: chararray, restauracja: chararray, ocena: float); grpRecs = zapisy grupowe według (użytkownik, miasto); avgRating_Byuser_perCity = foreach grpRecs generują spłaszczanie (grupa), AVG (rekordy.rating) jako średnie; Wynik = zrzut avgRating_Byuser_perCity; – Kumar

0

grupowanie dwóch przycisków, a następnie spłaszczenie struktury prowadzi do tego samego rezultatu:

Ładowanie danych jak ty

Data = LOAD 'data.txt' USING PigStorage(',') AS (
    user:chararray, city:chararray, restaurant:charray, rating:float); 

Grupa przez użytkownik i miasto

ByUserByCity = GROUP Data BY (user, city); 

Dodaj średnią ocen grup (możesz dodać więcej, np. COUNT (Dane) jako count_res) Następnie spłaszczyć strukturę grupy do oryginalnej.

ByUserByCityAvg = FOREACH ByUserByCity GENERATE 
FLATTEN(group) AS (user, city), 
AVG(Data.rating) as user_city_avg; 

Wyniki w:

Jim,London,2.0 
Jim,New York,3.75 
Lisa,London,3.75 
User,City, 
+0

Myślę, że to nie odpowiada na pytanie – Kumar

Powiązane problemy