相当于postgresql generate_series()函数?

qoefvg9y  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(344)

我使用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 bit在pig中很简单,但是 generate_series() 比特不是。
有没有一头Pig相当于 generate_series() ? 生成 datetime 直接创建对象是理想的,但是生成 int 顺序也可以。

deyfvvtc

deyfvvtc1#

如果您有另一个>24行的关系,请对该关系使用rank函数,然后按rank列排序,限制24行,然后选择only rank列。现在你有一个精确的24行的关系,每行代表1小时。把这个关系和你的最终报告联系起来。

相关问题