17

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

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
...

すべてのユーザー (アリスとボブ) について、上位 n 個の値(2 としましょう) を取得し、「カウント」の用語を並べ替えます。したがって、私が望む出力は次のとおりです。

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

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

4

2 に答える 2

6

私はちょうどその観察をしました

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)

お役に立てれば。

于 2014-04-14T21:45:25.173 に答える