我有类型记录:
time | url
==========
34 google.com
42 cnn.com
54 yahoo.com
64 fb.com
我想在这些记录time_diff
中添加另一列,它基本上取消了当前记录与前一记录的时间差异。输出应如下所示:
time | url | time_diff
======================
34 google.com -- <can drop this row>
42 cnn.com 08
54 yahoo.com 12
64 fb.com 10
如果我能以某种方式添加另一列(与time
相同),将time
移动一个,使42与34对齐,54与42对齐,依此类推,然后我就可以这些列之间的差异用于计算time_diff
列。
我可以将time
列投影到新变量T
,如果我可以删除原始数据中的第一条记录,那么我可以将其与T
一起加入以获得所需的结果
我感谢任何帮助。谢谢!
答案 0 :(得分:3)
例如,请参阅this question。你需要把你的元组放在一个包中(在你的情况下使用GROUP ... ALL
),然后在嵌套的FOREACH
,ORDER
中,并调用UDF对它们进行排名。获得此排名后,您可以FLATTEN
将该包再次退回到一组元组中,并且您将拥有三个字段:time
,url
和rank
。完成此操作后,创建第rank-1
列,在后两列上进行自我加入,您将拥有计算time_diff
所需的内容。
由于多条记录可以具有相同的time
,因此最好还要对url
进行排序,以确保每次都能获得相同的结果。
答案 1 :(得分:0)
我认为你可以使用&#34;导致&#34; PiggyBank的功能。像下面这样的东西可能有效。
A = LOAD 'T';
B = GROUP A ALL
C = FOREACH B {
C1 = ORDER A BY d;
GENERATE FLATTEN(Stitch(C1, Over(C1.time, 'lead')));
}
D = FOREACH C
GENERATE stitched::time AS time,
stitched::url AS url,
stitched::time - $3 AS time_diff;
https://pig.apache.org/docs/r0.12.0/api/org/apache/pig/piggybank/evaluation/Over.html