我有下表:
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 优化器应该能够将一种转换为另一种,但目前还不是这样。)
从 tbl_pets 中选择 set_union(pets) 作为 all_pets
这应该给出相同的结果