我正在使用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
序列也会很好。
答案 0 :(得分:0)
如果您有与> 24行的其他关系,请在该关系上使用RANK函数,然后按排名列排序,限制24然后仅选择排名列。现在你有一个完全24行的关系,每行代表1小时。 左外连接与您的最终报告关系的这种关系。