我有一个用例,我需要计算两个字段的不同数量。
样本 :
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);
};
我有一个用例,我需要计算两个字段的不同数量。
样本 :
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);
};
你非常接近。关键是不要应用于DISTINCT两个字段,而是将其应用于您创建的单个复合字段:
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);
};
恕我直言,没有简单的方法(如GROUP(DISTINCT a)MySQL 中的 a ),因此您需要拆分表以使每行计数两次。
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 可以大大简化这一点。