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

Posted

技术标签:

【中文标题】两个表之间的猪拉丁计数差异【英文标题】:Pig Latin Count difference between two tables 【发布时间】:2017-04-10 13:53:04 【问题描述】:

我有一个表加载了两次,以执行称为当前和上一个的自联接。两者都包含列“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  

【问题讨论】:

如果您可以分享示例数据和预期输出,那将会很有用。 @Amit 抱歉不清楚!我已经用一些示例数据和预期输出更新了我的帖子 【参考方案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;

【讨论】:

【参考方案2】:

假设您有两个组 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

【讨论】:

以上是关于两个表之间的猪拉丁计数差异的主要内容,如果未能解决你的问题,请参考以下文章

在 Microsoft Access 报告中获取两个计数之间的差异

BigQuery 减去两个表的计数?

比较两个蜂巢表之间的计数

text JavaScript中的猪拉丁语翻译

如何在猪拉丁语脚本中没有前导零时将值转换为 hhmm 格式

我正在尝试提高查找两个表之间差异的 Oracle SQL 的性能