猪拉丁计数两个表之间的差异

时间:2017-04-10 13:53:05

标签: apache-pig

我有一个表加载两次来执行一个名为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  

2 个答案:

答案 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;

Output

答案 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