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

j5fpnvbx  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(255)

我有表格的输入记录

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查找序列中的开始和结束日期
编写接受min和max并返回缺少时间戳的关系的udf
连接以上2个关系
我不能得到我的头在如何实现这在Pig虽然。如果有任何帮助,我将不胜感激。
谢谢!

sshcrbum

sshcrbum1#

使用脚本(外部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);
};

如果您需要进一步的澄清或帮助让我知道

rdlzhqv9

rdlzhqv92#

除了@rags answer,您还可以使用 STREAM x THROUGH 命令和一个简单的awk脚本(类似于此)来生成日期范围,一旦您有了最小和最大日期。类似于(未经测试!)您可能需要使用分号命令分隔将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)
}'`;

相关问题