Presto:聚合所有列的数组
Presto: Aggregate the arrays for all columns
我有以下 table:
name pets
Alex [dog, cat, bird]
Tom [rabbit, cat]
Mary [snake, dog, fish, cow]
Dave [dog]
我想知道是否可以创建一个查询来查找所有宠物。也就是说,我正在寻找如下输出:
[dog, cat, bird, rabbit, snake, fish, cow]
目前的方法是将 table 导出到 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)))
的更详细版本,但避免了在内存中实例化 array-or-arrays。
(理想情况下,Presto 优化器应该能够将一个转换为另一个,但现在还不是这样。)
我有以下 table:
name pets
Alex [dog, cat, bird]
Tom [rabbit, cat]
Mary [snake, dog, fish, cow]
Dave [dog]
我想知道是否可以创建一个查询来查找所有宠物。也就是说,我正在寻找如下输出:
[dog, cat, bird, rabbit, snake, fish, cow]
目前的方法是将 table 导出到 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)))
的更详细版本,但避免了在内存中实例化 array-or-arrays。
(理想情况下,Presto 优化器应该能够将一个转换为另一个,但现在还不是这样。)