Структура агрегированного списка Athena строка в список строк

#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