Presto:聚合所有列的数组

Posted

技术标签:

【中文标题】Presto:聚合所有列的数组【英文标题】:Presto: Aggregate the arrays for all columns 【发布时间】:2021-02-10 06:55:09 【问题描述】:

我有下表:

name   pets
Alex   [dog, cat, bird]
Tom    [rabbit, cat]
Mary   [snake, dog, fish, cow]
Dave   [dog]

我想知道是否可以创建一个查询来查找所有宠物。也就是说,我正在寻找这样的输出:

[dog, cat, bird, rabbit, snake, fish, cow]

目前的方法是将表格导出到 csv 并使用 python 来解决它。我想知道这是否可以直接在 Presto 查询中完成?谢谢!

【问题讨论】:

【参考方案1】:

Presto 具有强大的数组功能。这应该有效:

select array_distinct(flatten(array_agg(pets))) all_pets
from mytable

基本上这会将所有数组聚合到一起,作为数组的数组,然后将所有元素连接到一个数组中,最后删除重复项。

【讨论】:

【参考方案2】:

扩展@GMB 答案,从可扩展性的角度来看,这可能更友好:

presto> SELECT array_agg(DISTINCT e)
     -> FROM (VALUES ARRAY[1,2,3], ARRAY[2,3,4]) t(a)
     -> CROSS JOIN UNNEST(a) AS u(e);
    _col0
--------------
 [3, 2, 4, 1]

这绝对是array_distinct(flatten(array_agg(pets))) 的更详细版本,但避免在内存中实例化数组或数组。

(理想情况下,Presto 优化器应该能够将一个转换为另一个,但现在还不是。)

【讨论】:

以上是关于Presto:聚合所有列的数组的主要内容,如果未能解决你的问题,请参考以下文章

Presto 数组包含来自另一列的值(超集 SQL 查询)

Presto 查询行数组

如何在 Presto 中交叉加入取消嵌套 JSON 数组

Presto SQL - 如何获得数组的所有可能组合?

在 Presto 中基于固定移动日期窗口聚合数据

获取特定表中特定列的数据类型的 Presto 查询是啥?