如何在 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 - 如何在单个查询中获取列的最小值和最大值以及与它们关联的行?

mysql 中如何拿到每条数据最大值和最小值

如何在 Pig 和 Hive 中找到第 n 个最大和最小的数字?

Oracle数据库中求最大值和平均值的聚合函数是

SQL分组查询最大值最小值