如何查询与 Pig 中的最小值/最大值关联的数据



我在寻找每天最冷的时间。我的数据如下所示:

(2015/12/27,12AM,32.0)
(2015/12/27,12PM,34.0)
(2015/12/28,10AM,26.1)
(2015/12/28,10PM,28.0)
(2015/12/28,11AM,27.0)
(2015/12/28,11PM,28.9)
(2015/12/28,12AM,25.0)
(2015/12/28,12PM,26.100000000000005)
(2015/12/29,10AM,22.45)
(2015/12/29,10PM,26.1)
(2015/12/29,11AM,24.1)
(2015/12/29,11PM,25.0)
(2015/12/29,12AM,28.9)

我每天分组以找到具有以下代码的最小温度:

minTemps = FOREACH gdate2 GENERATE group as day,MIN(removeDash.temp) as minTemp;

给出以下输出:

(2015/12/18,17.1)
(2015/12/19,12.9)
(2015/12/20,23.0)
(2015/12/21,32.0)
(2015/12/22,30.899999999999995)
(2015/12/23,36.05)
(2015/12/24,30.45)
(2015/12/25,26.55)
(2015/12/26,28.899999999999995)
(2015/12/27,26.1)
(2015/12/28,23.55)
(2015/12/29,21.0)

我的问题:我还需要最低温度发生的小时。我怎样才能得到小时?

如果我正确理解了您的问题,则按(day, hour)分组将不起作用,因为这会找到每小时最冷的温度,而不是每天最冷的小时和温度。

相反,请使用嵌套的foreach:

B = GROUP A BY day;
C = FOREACH B {
orderd = ORDER A BY temp ASC;
limitd = LIMIT orderd 1;
GENERATE FLATTEN(limitd) AS (day, hour, temp); 
};

像以前一样按天分组,然后按温度对同一天内的所有小时进行排序,并仅选择顶部记录。请注意,如果两个或更多小时之间存在平局,则只会选择其中一个小时。

是的,你走在正确的轨道上。将您的组语句修改为按天和小时分组。最后在你的组上使用 FLATTEN 解耦键。

gdate2 = GROUP removeDash by (day,hour);
minTemps = FOREACH gdate2 GENERATE FLATTEN(group) as (day,hour),MIN(removeDash.temp) as minTemp;

最新更新