Apache Pig:通过转移加入记录

时间:2013-01-14 19:51:02

标签: join apache-pig

我有类型记录:

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一起加入以获得所需的结果

我感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:3)

例如,请参阅this question。你需要把你的元组放在一个包中(在你的情况下使用GROUP ... ALL),然后在嵌套的FOREACHORDER中,并调用UDF对它们进行排名。获得此排名后,您可以FLATTEN将该包再次退回到一组元组中,并且您将拥有三个字段:timeurlrank 。完成此操作后,创建第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