如何从直方图中选择与最大值对应的键?

时间:2019-02-25 03:16:16

标签: amazon-athena

我正在使用histogram()函数https://prestodb.github.io/docs/current/functions/aggregate.html

“返回包含每个输入值出现次数的计数的映射。”

结果可能看起来像这样:

{ORANGES=1, APPLES=165, BANANAS=1}

是否有一个函数会根据上述输入返回APPLES

XY问题?

机敏的读者可能会注意到histogram()的最终结果与我正在尝试做的事情相结合,将等同于教科书中存在的神话般的 Mode Function (模式功能)在实际的数据库引擎中。

这是我目前完整的查询。我正在为每个upper(cmplx)元组寻找upper(address),zip最频繁出现的值:

select * from (select upper(address) as address, zip, 
               (SELECT max_by(key, value) 
                FROM unnest(histogram(upper(cmplx))) as t(key, value)),
               count(*) as N
from apartments 
group by upper(address), zip) t1
where N > 3
order by N desc;

还有错误...

  

SYNTAX_ERROR:第2:55行:常量表达式不能包含列   参考

2 个答案:

答案 0 :(得分:1)

您可以使用map_entries将从map获得的histogram转换为数组。然后,您可以UNNEST将该数组建立​​为关系,然后可以调用max_by。请参见以下示例:

SELECT max_by(key, value) FROM (
    SELECT map_entries(histogram(clerk)) as entries from tpch.tiny.orders
)
CROSS JOIN UNNEST (entries) t(key, value);

编辑:

如@Alex R所述,您还可以将histogram的结果直接传递给UNNEST

SELECT max_by(key, value) FROM ( 
    SELECT histogram(clerk) as histogram from tpch.tiny.orders ) 
CROSS JOIN UNNEST (histogram) t(key, value);

在您的问题中,查询部分(SELECT max_by(key, value) FROM unnest(histogram(upper(cmplx))是尚不支持的相关子查询。但是,您看到的错误是令人误解的。 IIRC Athena使用的是Presto 0.172,此错误报告已在0.183中修复(请参见https://docs.starburstdata.com/latest/release/release-0.183.html-在2017年7月,在0.183中还添加了btw map_entries

答案 1 :(得分:1)

这是我用来从任意映射中获取与最大值对应的键的方法:

setVertexBuffer:...

将直方图地图替换为“地图名称”。

不确定该解决方案在计算上与其他答案相比如何,但是我确实更容易阅读。