如何在猪拉丁语的日期时间范围内创建缺失的记录

Posted

技术标签:

【中文标题】如何在猪拉丁语的日期时间范围内创建缺失的记录【英文标题】:How to create missing records within date-time range in pig latin 【发布时间】:2013-07-29 18:46:52 【问题描述】:

我有表单的输入记录

2013-07-09T19:17Z,f1,f2
2013-07-09T03:17Z,f1,f2
2013-07-09T21:17Z,f1,f2
2013-07-09T16:17Z,f1,f2
2013-07-09T16:14Z,f1,f2
2013-07-09T16:16Z,f1,f2
2013-07-09T01:17Z,f1,f2
2013-07-09T16:18Z,f1,f2

这些代表时间戳和事件。这些都是我手写的,但实际数据应该根据时间排序。

我想生成一组记录,这些记录将输入到需要连续时间序列的绘图函数中。我想填写缺失值,即如果有“2013-07-09T19:17Z”和“2013-07-09T19:19Z”的条目,我想生成“2013-07-09T19:18Z”的条目" 具有预定义的值。

我对这样做的想法:

    使用 MIN 和 MAX 查找系列中的开始和结束日期 写入 UDF,取最小值和最大值并返回缺失的关系 时间戳 加入以上 2 个关系

我无法理解如何在 PIG 中实现这一点。将不胜感激。

谢谢!

【问题讨论】:

【参考方案1】:

使用脚本(在 pig 之外)生成另一个文件,其中包含 MIN 和 MAX 之间的所有时间戳,包括 MIN 和 MAX。将此作为第二个数据集加载。这是我从您的数据集中使用的示例。请注意,我只填补了几个空白,而不是全部。

2013-07-09T01:17Z,d1,d2
2013-07-09T01:18Z,d1,d2
2013-07-09T03:17Z,d1,d2
2013-07-09T16:14Z,d1,d2
2013-07-09T16:15Z,d1,d2
2013-07-09T16:16Z,d1,d2
2013-07-09T16:17Z,d1,d2
2013-07-09T16:18Z,d1,d2
2013-07-09T19:17Z,d1,d2
2013-07-09T21:17Z,d1,d2

对原始数据集和上面生成的数据集进行 COGROUP。使用嵌套的 FOREACH GENERATE 来编写输出数据集。如果第一个数据集为空,则使用第二个集合中的值生成输出数据集,否则使用第一个数据集。这是我在这两个数据集上使用的一段代码。

Org_Set = LOAD 'pigMissingData/timeSeries' USING PigStorage(',') AS (timeStamp, fl1, fl2);
Default_set = LOAD 'pigMissingData/timeSeriesFull' USING PigStorage(',') AS (timeStamp, fl1, fl2);
coGrouped = COGROUP Org_Set BY timeStamp, Default_set BY timeStamp;

Filled_Data_set = FOREACH coGrouped 
    x = COUNT(times);
    y = (x == 0?  (Default_set.fl1, Default_set.fl2): (Org_Set.fl1, Org_Set.fl2));
    GENERATE FLATTEN(group), FLATTEN(y.$0), FLATTEN(y.$1);
;

如果您需要进一步说明或帮助,请告诉我

【讨论】:

【参考方案2】:

除了@Rags 答案之外,您还可以使用STREAM x THROUGH 命令和一个简单的awk 脚本(similar to this one)在您获得最小和最大日期后生成日期范围。类似于(未经测试!-您可能需要用分号命令分隔符单行 awk 脚本,或者最好将其作为脚本文件发送)

grunt> describe bounds;
(min:chararray, max:chararray)
grunt> dump bounds;
(2013/01/01,2013/01/04)
grunt> fullDateBounds = STREAM bounds THROUGH `gawk '
  split($1,s,"/")
  split($2,e,"/")
  st=mktime(s[1] " " s[2] " " s[3] " 0 0 0")
  et=mktime(e[1] " " e[2] " " e[3] " 0 0 0")
  for (i=st;i<=et;i+=60*24) print strftime("%Y/%m/%d",i)
'`;

【讨论】:

以上是关于如何在猪拉丁语的日期时间范围内创建缺失的记录的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas 插值:在缺失的日期范围内重新分配值

如何从 Laravel 日期范围内未创建的数据库中获取记录?

SQL如何编写返回缺失日期范围的查询?

MySQL:查找日期范围之间的缺失日期

在猪拉丁语中为 foreach 生成一个 id/counter

计算平均值 (AVG),包括 Redshift DB 中某个日期范围内的缺失数据