#sql #presto #amazon-athena
#sql #presto #amazon-athena
Вопрос:
У меня есть агрегированный массив типа array<struct<string,string>>
, и я хотел бы преобразовать его в array<struct<string,array<string>>>
Точнее, у меня есть такой список
[{'a', 'b'}, {'a', 'c'}, {'d', 'e'}]
И я хотел бы объединить это как
[{'a', ['b', 'c']}, {'d', ['e']}]
Как я могу преобразовать это подобным образом в Athena?
Ответ №1:
Функция multimap_from_entries
делает именно то, что вам нужно.
Смотрите документ функции.
Редактировать:
Пока aws решает обновить presto :-), вот обходной путь:
SELECT map_filter(reduce(array[cast(('a', 'b') AS row(one varchar, two varchar)),
cast(('a', 'c') AS row(one varchar, two varchar)),
cast(('d', 'e') AS row(one varchar, two varchar))],
map(array[cast('' as varchar)], array[array[cast('' as varchar)]]),
(s,x)-> if(s[x.one] is null, map_concat(s,map(array[x.one], array[array[x.two]])),
map_concat(s,map(array[x.one], array[s[x.one] || array[x.two]])))
, s->s), (k,v)->k <> '')
-- {a=[b, c], d=[e]}
Идея состоит в том, чтобы перебрать массив и построить сопоставление, либо вставив новый ключ, пару значений, если ключ новый, либо расширив массив значений новым значением.
Комментарии:
1. Я видел это, но multimap не реализованы в Athena