我有
形式的输入记录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"和#34; 2013-07-09T19:19Z",我想为" 2013-07-09T19:18Z"生成条目。具有预定义的值。
我对这样做的想法:
我无法理解如何在PIG中实现这一点。非常感谢任何帮助。
谢谢!
答案 0 :(得分: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 :(得分: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)
}'`;