8

レストランのレビューのデータ セットがあるとします。

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

そして、平均的なレビューのユーザー別と都市別のリストを作成したいと思います。すなわち出力:

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

Pig スクリプトは次のように記述できます。

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

ただし、最初に上位レベルのグループ (ユーザー) をグループ化し、後で次のレベル (都市) をサブグループ化できるかどうかに興味があります。

PerUser = GROUP Data BY user;

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

私は得る:

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

これを試して成功した人はいますか?FOREACH内でグループ化することは単に不可能ですか?

私の目標は、次のようなことをすることです:

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

5 に答える 5

9

現在、許可されている操作は、、、、DISTINCTおよびFOREACHFILTERです。LIMITORDER BY

あなたが言ったように、今のところ(ユーザー、都市)で直接グループ化するのが良い方法です。

于 2011-02-11T18:17:47.453 に答える
2

Pig バージョン 0.10 のリリース ノートでは、ネストされた FOREACH 操作が現在サポートされていることが示唆されています。

于 2012-12-27T15:45:11.553 に答える
1

これを試して:

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;
于 2014-05-18T18:37:23.587 に答える
0

2 つのキーでグループ化してから構造をフラット化すると、同じ結果になります。

あなたがしたようにデータをロードする

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

ユーザーと都市でグループ化

 ByUserByCity = GROUP Data BY (user, city);

グループの評価平均を追加します (COUNT(Data) のように、count_res としてさらに追加できます) 次に、グループ構造を元の構造にフラット化します。

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

結果:

Jim,London,2.0
Jim,New York,3.75
Lisa,London,3.75
User,City,
于 2014-05-21T11:07:35.747 に答える