如何在 Pig 中查询与最小值/最大值相关的数据
Posted
技术标签:
【中文标题】如何在 Pig 中查询与最小值/最大值相关的数据【英文标题】:How to Query Data Associated With Minimum/Maximum in Pig 【发布时间】:2018-05-07 21:54:11 【问题描述】:我正在寻找每天最冷的时间。我的数据如下所示:
(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)
我的问题:我还需要最低温度发生的时间。 我怎样才能得到小时数?
【问题讨论】:
按日期和时间分组以实现您的愿望 对不起,这里的菜鸟。就像是? gdate2 = GROUP removeDash by (day,hour); 【参考方案1】:如果我正确理解了您的问题,则按 (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);
;
像以前一样按天分组,然后按温度对同一天内的所有小时进行排序,并仅选择最高记录。请注意,如果两个或多个小时之间存在相同的情况,则只会选择其中一个小时。
【讨论】:
谢谢!你确实理解正确。我没有受命,但祝福你的灵魂野蛮数据。【参考方案2】:是的,你在正确的轨道上。修改你的组语句以按天和小时分组。最后在你的组上使用 FLATTEN 解耦键。
gdate2 = GROUP removeDash by (day,hour);
minTemps = FOREACH gdate2 GENERATE FLATTEN(group) as (day,hour),MIN(removeDash.temp) as minTemp;
【讨论】:
以上是关于如何在 Pig 中查询与最小值/最大值相关的数据的主要内容,如果未能解决你的问题,请参考以下文章
用于查找每个部门的工资的最大值、最小值、平均值、总和的 Pig 脚本
PostgreSQL - 如何在单个查询中获取列的最小值和最大值以及与它们关联的行?