我有一个表加载两次来执行一个名为current和previous的自连接。两者都包含“key”(非唯一)和“value”列。我按键分组,并计算每组键中的值的数量。
我想找到与前一个表相比当前表中添加了多少个值,但是我得到错误“标量投影无效:cur_count:需要从一个关系中投射一列来使用它作为标量“。我对猪拉丁语比较新,所以我不确定执行这种差异的语法是什么。
请忽略cur_count和prev_count的语法。
cur_count = FOREACH cur_grouped GENERATE COUNT(current);
prev_count = FOREACH prev_grouped GENERATE COUNT(previous);
left_join = join current by key LEFT OUTER, previous by key-1;
difference = FOREACH left_join GENERATE key, cur_count-prev_count; //error here
dump difference;
以下是一些示例数据
key value
1 12
1 34
1 11
1 45
2 4
3 34
3 34
3 23
4 15
4 19
到目前为止我的脚本执行的操作:它计算每组键中的值的数量
key count
1 4
2 1
3 3
4 2
我想找到一个键和上一个键之间的值数量的差异
key difference
2 -3
3 2
4 -1
答案 0 :(得分:1)
cur_count和prev_count是关系,不能按照您使用的方式使用。您可以使用下面的脚本实现所需的输出。在使用(key-1)加入关系后,使用关系中的列来获得差异
A = LOAD 'data.txt' USING PigStorage(',') AS (f1:int,f2:int);
B = GROUP A BY f1;
C = FOREACH B GENERATE group,COUNT(A);
D = FOREACH B GENERATE group,COUNT(A);
E = JOIN C BY $0,D BY ($0-1);
F = FOREACH E GENERATE $2,$3-$1;
DUMP F;
答案 1 :(得分:1)
假设您有两组grp1和grp2,其中包含您之前描述的内容
key count
1 4
2 1
3 3
4 2
注意:我没有执行Pig声明。
-- Generate the Ranks for two relations
grp1 = rank grp1;
grp2 = rank grp2;
-- Increment rank by 1 for each record in grp2
grp2 = foreach grp2 generate ($0+1) as rank,key,count
在这些之后,两个关系将如下所示。将它们并排排列以进行比较。
Group 1 Group 2
Rank key count Rank key count
1 1 4 2 1 4
2 2 1 3 2 1
3 3 3 4 3 3
4 4 2 5 4 2
通过RANK加入两组,这将产生低于输出
Rank key count Rank key count
2 2 1 2 1 4
3 3 3 3 2 1
4 4 2 4 3 3
5 4 2
现在你可以运行另一个" foreach"找到上面两个计数列的差异的语句。
result = FOREACH <<joined relation>> GENERATE $1 as key,($2-$5) as difference