1

我有以下类型的记录:

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)将time42 与 34 对齐,54 与 42 对齐,依此类推,那么我可以利用这些列之间的差异来计算time_diff列。

我可以将time列投影到一个新变量T,如果我可以删除原始数据中的第一条记录,那么我可以加入它T以获得所需的结果。

我很感激任何帮助。谢谢!

4

2 回答 2

3

例如,请参阅这个问题。您需要将元组放在一个袋子中(GROUP ... ALL在您的情况下使用),然后在嵌套的FOREACH,ORDER它们中并调用 UDF 对它们进行排名。获得此等级后,您可以FLATTEN再次将袋子放回一组元组中,您将拥有三个字段:timeurlrank。一旦你有了这个,创建第​​四列即rank-1,对后两列进行自连接,你将拥有计算time_diff.

由于多条记录可以具有相同的time,因此最好也进行排序,url以保证每次都得到相同的结果。

于 2013-01-17T13:26:28.167 回答
0

我认为您可以使用 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

于 2016-02-24T02:03:20.447 回答