【问题标题】:Apache Pig: Join records by shiftingApache Pig:通过移位加入记录
【发布时间】:2013-01-14 19:51:02
【问题描述】:

我有以下类型的记录:

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 连接起来以获得所需的结果。

感谢您的帮助。谢谢!

【问题讨论】:

  • 您是否有可能同时拥有多行?如果是,是什么决定了它们的顺序?
  • 时间是非递减顺序(是的,多行可以有相同的时间)。

标签: join apache-pig


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我认为你可以使用 PiggyBank 的“lead”功能。像下面这样的东西可能会起作用。

     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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多