すでにグループ化および集計されているデータがあります。次のようになります。
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
どうすればそれを達成できますか?
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)
私はそれを観察しました
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)
お役に立てれば。