Presto:聚合所有列的数组



我有下表:

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查询中完成?谢谢

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

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

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

扩展@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优化器应该能够将其中一个转换为另一个,但现在还不是这样。(

相关内容

  • 没有找到相关文章

最新更新