2011-02-08 29 views
7

Hãy nói rằng tôi có một tập hợp dữ liệu đánh giá nhà hàng:Tôi có thể tạo các túi lồng nhau bằng cách sử dụng các câu lệnh FOREACH lồng nhau trong Pig Latin không?

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 

Và tôi muốn tạo ra một danh sách bằng cách sử dụng và thành phố của bộ lọc trung bình. I E. đầu ra:

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

tôi có thể viết một kịch bản Pig như sau:

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); 
} 

Tuy nhiên tôi tò mò liệu tôi có thể nhóm đầu tiên nhóm cao cấp (người sử dụng) và nhóm sau đó phụ cấp độ tiếp theo (thành phố) sau: tức là

PerUser = GROUP Data BY user; 

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

tôi nhận được:

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

Có ai đã thử điều này với thành công không? Đơn giản là không thể GROUP trong một FOREACH?

Mục tiêu của tôi là để làm một cái gì đó như:

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

Trả lời

8

Hiện nay các hoạt động cho phép là DISTINCT, FILTER, LIMITORDER BY bên trong một FOREACH.

Hiện tại việc nhóm trực tiếp theo (người dùng, thành phố) là cách tốt nhất để làm như bạn đã nói.

+0

liên kết đã phá vỡ con người –

2

Ghi chú phát hành cho phiên bản Pig 0.10 cho thấy các hoạt động FOREACH lồng nhau là now supported.

+0

Cảm ơn bạn. Tại sao hai GENERATE được yêu cầu trong khối bên trong? –

+0

Rút lại đề xuất của tôi. Ghi chú phát hành cho thấy điều này có thể được thực hiện, nhưng tôi không thể làm cho nó hoạt động. – 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

Hãy thử điều này:

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

Bạn nên thêm mô tả mã này hoàn thành và cách thực hiện điều này. –

+0

Điều này không đúng ... Phải là Bản ghi = tải 'data_rating.txt 'sử dụng PigStorage (', ') là (người dùng: chararray, thành phố: chararray, nhà hàng: chararray, rating: float); grpRecs = nhóm Bản ghi theo (người dùng, thành phố); avgRating_Byuser_perCity = foreach grpRecs tạo ra flatten (nhóm), AVG (Records.rating) là trung bình; Kết quả = dump avgRating_Byuser_perCity; – Kumar

0

Nhóm bởi hai phím và sau đó làm phẳng cấu trúc dẫn đến cùng một kết quả:

Đang tải dữ liệu như bạn đã làm

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

Đoàn tự do người dùng và thành phố

ByUserByCity = GROUP Data BY (user, city); 

Thêm mức trung bình của các nhóm (bạn có thể thêm nhiều hơn, như COUNT (Dữ liệu) là count_res) Sau đó làm phẳng cấu trúc nhóm thành nhóm ban đầu.

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

Kết quả trong:

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

Tôi đoán, điều này không trả lời được câu hỏi – Kumar

Các vấn đề liên quan