【问题标题】:Time differences in Apache Pig?Apache Pig 的时差?
【发布时间】:2016-05-02 13:59:13
【问题描述】:

在大数据上下文中,我有一个按升序排序的时间序列 S1=(t1, t2, t3 ...)。我想产生一系列时差:S2=(t2-t1, t3-t2 ...)

  1. 有没有办法在 Apache Pig 中做到这一点?差一个很 自加入效率低下,我没有看到一个。

  2. 如果不是,什么是适合大批量的好方法 数据?

【问题讨论】:

  • 您能否对输入数据进行采样,并且记录中的字段数是否保持不变?
  • @MuraliRao Pig 具有 SAMPLE 功能:请参阅 Pig Manual 允许您指定要采样的百分比。在这种特殊情况下,我确实知道时间序列在严格增加,但我不确定它是否会有所作为。关键假设是它已经排序。
  • 我的意思是输入测试数据来尝试这个用例。

标签: apache-pig bigdata


【解决方案1】:
  1. S1 = 生成 Id、时间戳,即从 t1...tn
  2. S2 = 生成 Id、时间戳,即从 t2...tn
  3. S3 = 按 Id 加入 S1,按 Id 加入 S2
  4. S4 = 提取 S1.Timestamp,S2.Timestamp,(S2.TimeStamp - S1.TimeStamp)

编辑

样本数据

2014-02-19T01:03:37
2014-02-26T01:03:39
2014-02-28T01:03:45
2014-04-01T01:04:22
2014-05-11T01:06:02
2014-06-30T01:08:56

脚本

s1 = LOAD 'test2.txt' USING PigStorage() AS (t:chararray);
s11 = foreach s1 generate ToDate(t) as t1;
s1_new = rank s11;

s2 = LOAD 'test2.txt' USING PigStorage() AS (t:chararray);
s22 = foreach s2 generate ToDate(t) as t1;
s2_new = rank s22;

-- Filter records by excluding the 1 ranked row and rank the new data
ss = FILTER s2_new by (rank_s22 > 1);
ss_new = rank ss;

s3 = join s1_new by rank_s11,ss_new by rank_ss;
s4 = foreach s3 generate DaysBetween(ss_new::t1,s1_new::t1) as time_diff;

DUMP s4;

【讨论】:

  • 我认为这可能有效!不过,我不确定如何在 Pig 中轻松完成第 2 步。
  • 我已经编辑了答案以包含示例数据、脚本和输出。请注意,您可能必须格式化输出以满足您的要求。输出是连续时间戳之间的天数差异。跨度>
  • 非常好的和完整的解决方案;由于我的等级,目前无法将其标记为这样。谢谢!
猜你喜欢
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 2014-01-08
相关资源
最近更新 更多