web-dev-qa-db-ja.com

豚:グループごとに上位n個の値を取得

すでにグループ化および集計されているデータがあります。次のようになります。

user    value      count
----    --------  ------
Alice   third      5
Alice   first      11
Alice   second     10
Alice   fourth     2
...
Bob     second     20
Bob     third      18
Bob     first      21
Bob     fourth     8
...

すべてのユーザー(AliceとBob)について、それらの上位n値(2としましょう)を取得し、 'count'の用語を並べ替えます。だから私が望む望ましい出力はこれです:

Alice first 11
Alice second 10
Bob first 21
Bob second 20

どうすればそれを達成できますか?

17
Hoff

1つのアプローチは

records = LOAD '/user/nubes/ncdc/micro-tab/top.txt' AS (user:chararray,value:chararray,counter:int);
grpd = GROUP records BY user;

top3 = foreach grpd {
        sorted = order records by counter desc;
        top    = limit sorted 2;
        generate group, flatten(top);
};

入力は:

Alice   third   5 
Alice   first   11 
Alice   second  10
Alice   fourth  2
Bob second  20
Bob third   18
Bob first   21
Bob fourth  8

出力は次のとおりです。

(Alice,Alice,first,11)
(Alice,Alice,second,10
(Bob,Bob,first,21)
(Bob,Bob,second,20)
29
Nag

私はそれを観察しました

top    = limit sorted 2;

topは組み込み関数であり、エラーをスローする可能性があるため、この場合、代わりに関係の名前を変更するだけで、

generate group, flatten(top);

これは出力を与えていました

(Alice,Alice,first,11)
(Alice,Alice,second,10
(Bob,Bob,first,21)
(Bob,Bob,second,20)

以下に示すように修正-

records = load 'test1.txt' using PigStorage(',') as (user:chararray, value:chararray, count:int);
grpd = GROUP records BY user;
top2 = foreach grpd {
        sorted = order records by count desc;
        top1    = limit sorted 2;
        generate flatten(top1);
};

あなたが必要とする望ましい出力を私に与えました-

(Alice,first,11)
(Alice,second,10)
(Bob,first,21)
(Bob,second,20)

お役に立てれば。

6
Rajnish G