1

したがって、文字列と数値の 2 つの値を持つデータがあります。

data(string:chararray, number:int)

5つの異なるルールで数えています

1: int は 0 ~ 1 です。

2: int は 1~2 です。

5: int は 4~5 です。

個別に数えることができたので、

zero_to_one = filter avg_user by average_stars >= 0 and average_stars <= 1;
A = GROUP zero_to_one ALL;
zto_count = FOREACH A GENERATE COUNT(zero_to_one);

one_to_two = filter avg_user by average_stars > 1 and average_stars <= 2;
B = GROUP one_to_two ALL;
ott_count = FOREACH B GENERATE COUNT(one_to_two);

two_to_three = filter avg_user by average_stars > 2 and average_stars <= 3;
C = GROUP two_to_three ALL;
ttt_count = FOREACH C GENERATE COUNT( two_to_three);

three_to_four = filter avg_user by average_stars > 3 and average_stars <= 4;
D = GROUP three_to_four ALL;
ttf_count = FOREACH D GENERATE COUNT( three_to_four);

four_to_five = filter avg_user by average_stars > 4 and average_stars <= 5;
E = GROUP four_to_five ALL;
ftf_count = FOREACH E GENERATE COUNT( four_to_five);

したがって、これは実行できますが、これでは 5 つの個別のテーブルしか得られません。

方法があるかどうかを確認したいです (空想的であっても大丈夫です。私は空想的なものが大好きです) T は単一のテーブルで結果を作成できます。

つまり、

zto_count = 1
ott_count = 3
. = 2
. = 3
. = 5

テーブルは {1,3,2,3,5} になります

データを解析し、そのように整理するのは簡単です。

方法はありますか?

4

1 に答える 1

2

これを入力として使用:

foo 2
foo 3
foo 2
foo 3
foo 5
foo 4
foo 0
foo 4
foo 4
foo 5
foo 1
foo 5

(0 と 1 は各 1 回、2 と 3 は各 2 回、4 と 5 は各 3 回)

このスクリプト:

A = LOAD 'myData' USING PigStorage(' ') AS (name: chararray, number: int);

B = FOREACH (GROUP A BY number) GENERATE group AS number, COUNT(A) AS count ;

C = FOREACH (GROUP B ALL) {
    zto = FOREACH B GENERATE (number==0?count:0) + (number==1?count:0) ;
    ott = FOREACH B GENERATE (number==1?count:0) + (number==2?count:0) ;
    ttt = FOREACH B GENERATE (number==2?count:0) + (number==3?count:0) ;
    ttf = FOREACH B GENERATE (number==3?count:0) + (number==4?count:0) ;
    ftf = FOREACH B GENERATE (number==4?count:0) + (number==5?count:0) ;
    GENERATE SUM(zto) AS zto,
             SUM(ott) AS ott,
             SUM(ttt) AS ttt,
             SUM(ttf) AS ttf,
             SUM(ftf) AS ftf ;
}

次の出力が生成されます。

C: {zto: long,ott: long,ttt: long,ttf: long,ftf: long}
(2,3,4,5,6)

C には最大で 5 つの要素しかないため、C の FOREACH の数はそれほど重要ではありませんが、そうである場合は、次のようにまとめることができます。

C = FOREACH (GROUP B ALL) {
    total = FOREACH B GENERATE (number==0?count:0) + (number==1?count:0) AS zto,
                               (number==1?count:0) + (number==2?count:0) AS ott,
                               (number==2?count:0) + (number==3?count:0) AS ttt,
                               (number==3?count:0) + (number==4?count:0) AS ttf,
                               (number==4?count:0) + (number==5?count:0) AS ftf ;
    GENERATE SUM(total.zto) AS zto,
             SUM(total.ott) AS ott,
             SUM(total.ttt) AS ttt,
             SUM(total.ttf) AS ttf,
             SUM(total.ftf) AS ftf ;
}
于 2013-07-02T21:08:03.913 に答える