相当于PostgreSQL的generate_series()函数



我使用Pig来处理数据,以创建每天的小时报告。(因此,我每天晚上都会发布这份报告,其中24行代表过去24小时。)基本上,我只是做了这样的事情:

REGISTER /path/to/pig/contrib/piggybank/java/piggybank.jar;                         
DEFINE ISOToUnix org.apache.pig.piggybank.evaluation.datetime.convert.ISOToUnix();                         
DEFINE UnixToISO org.apache.pig.piggybank.evaluation.datetime.convert.UnixToISO();                         
DEFINE ISOToHour org.apache.pig.piggybank.evaluation.datetime.truncate.ISOToHour();                                                                                             
absdata = LOAD 'absdata.csv' USING PigStorage(",") AS (ts:datetime, a:int, b:int);
reldata = FOREACH absdata GENERATE HoursBetween(ToDate(ISOToUnix(ISOToHour(UnixToISO(1000L*ToUnixTime(CurrentTime()))))), ToDate(ISOToUnix(ISOToHour(UnixToISO(1000L*ToUnixTime(ts)))))) AS hs, a, b;
aggdata = GROUP reldata BY hs;
report  = FOREACH aggdata GENERATE group AS hs, SUM(aggdata.a) AS a, SUM(aggdata.b) AS b;
STORE report INTO '/my/reports' using PigStorage(',','-schema');

报告应该总是恰好有24行数据:过去24小时每小时1行。但是,我发现有时输入数据在一天中的某个小时内没有事件,因此缺少输出行。

在PostgreSQL中,我只使用generate_series()来生成我关心的所有时间,并快速使用LEFT OUTER JOIN来确保我在报告中拥有所有行。我发现LEFT OUTER JOIN位在pig中是直接的,但generate_series()位不是。

是否存在与generate_series()相等的猪?直接生成datetime对象将是理想的,但生成int序列也会很好。

如果你有一个>24行的关系,在这个关系上使用RANK函数,然后按RANK列排序,限制24,然后只选择RANK列。现在你有了一个24行的关系,每一行代表一个小时。

相关内容

  • 没有找到相关文章

最新更新