2013-07-29 30 views
1

日期,时间范围内丢失记录我的形式如何创建的Pig Latin

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”生成条目“与预定义值。

我就这样做的想法:

  1. 使用MIN和MAX找到该系列中的开始和结束日期
  2. 写UDF这需要最小值和最大值,并返回一个缺少 关系时间戳
  3. 加入以上2个关系

我不能让我的头在如何实施这个在PIG虽然。将不胜感激任何帮助。

谢谢!

回答

1

使用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); 
}; 

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

1

除了@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) 
}'`;