Pig Latin相当于PostgreSQL的generate_series()函数?

时间:2014-08-08 20:10:42

标签: hadoop mapreduce apache-pig

我正在使用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位在猪中是直截了当的,但generate_series()位不是。

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

1 个答案:

答案 0 :(得分:0)

如果您有与> 24行的其他关系,请在该关系上使用RANK函数,然后按排名列排序,限制24然后仅选择排名列。现在你有一个完全24行的关系,每行代表1小时。 左外连接与您的最终报告关系的这种关系。