4

2 つのフィールドの個別の数をカウントする必要があるユースケースがあります。

サンプル :

x = LOAD 'testdata' using PigStorage('^A') as (a,b,c,d);

y = GROUP x BY a;

z = FOREACH y {

        **bc = DISTINCT x.b,x.c;**
        dd = DISTINCT x.d;
        GENERATE FLATTEN(group) as (a), COUNT(bc), COUNT(dd);
};
4

2 に答える 2

9

あなたはかなり近かった。重要なのは、DISTINCT2つのフィールドに適用するのではなく、作成する単一の複合フィールドに適用することです。

x = LOAD 'testdata' using PigStorage('^A') as (a,b,c,d);
x2 = FOREACH x GENERATE a, TOTUPLE(b,c) AS bc, d
y = GROUP x2 BY a;
z = FOREACH y {
        bc = DISTINCT x2.bc;
        dd = DISTINCT x2.d;
        GENERATE FLATTEN(group) AS (a), COUNT(bc), COUNT(dd);
};
于 2013-03-06T19:20:46.327 に答える
0

IMHO、(MySQL の a のような) 簡単な方法はないGROUP(DISTINCT a)ため、テーブルを分割して行ごとに 2 つのカウントを作成する必要があります。

x = LOAD 'testdata' using PigStorage('^A') as (a,b,c,d);

w1 = FOREACH x GENERATE a, CONCAT(b,c) AS bc;
w2 = FOREACH x GENERATE a, d;

v1 = DISTINCT w1;
v2 = DISTINCT w2;

u1 = GROUP v1 BY a;
u2 = GROUP v2 BY a;

t1 = FOREACH u1 GENERATE group AS a, COUNT(v1.bc);
t2 = FOREACH u2 GENERATE group AS a, COUNT(v2.d);

s = JOIN t1 BY a, t2 BY a;

UDF を使用すると、これを大幅に簡素化できます。

于 2013-03-06T16:38:24.110 に答える