apache pig:通过移位连接记录

gywdnpxw  于 2021-06-24  发布在  Pig
关注(0)|答案(2)|浏览(301)

我有以下类型的记录:

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 以获得期望的结果。
谢谢你的帮助。谢谢!

qc6wkl3g

qc6wkl3g1#

例如,看这个问题。你需要把元组放在一个袋子里(使用 GROUP ... ALL 在你的情况下),然后在一个嵌套的 FOREACH , ORDER 然后打电话给一个自定义项来给他们排名。等你有了这个军衔,你就可以 FLATTEN 再次将包返回到一组元组中,您将有三个字段: time , url ,和 rank . 一旦你有了这个,创建第四列 rank-1 ,对后两列进行自联接,就可以计算 time_diff .
因为多个记录可以有相同的 time ,这将是一个好主意,也排序 url 这样你每次都能得到相同的结果。

e0bqpujr

e0bqpujr2#

我想你可以使用“铅”的功能的Pig。像下面这样的方法可能有用。

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

相关问题