Pig Latin 两个表之间的计数差异

Pig Latin Count difference between two tables

我有一个 table 加载了两次以执行称为当前和上一个的自连接。两者都包含列 "key"(不唯一)和 "value"。我按键分组,并计算每组键中值的数量。

我想知道与之前的 table 相比,当前的 table 增加了多少个值,但我得到了错误 "Invalid scalar projection: cur_count : A column needs to be projected from a relation for it to be used as a scalar"。我对 pig latin 比较陌生,所以我不确定执行这种差异的语法应该是什么。

请忽略 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  

cur_count 和 prev_count 是关系,不能像你这样使用 using.You 可以使用脚本 below.After 加入关系(关键-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 [=10=],D BY ([=10=]-1);
F = FOREACH E GENERATE ,-;
DUMP F;

假设您有两个组 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 ([=11=]+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  as key,(-) as difference