Presto — Превратите 2 массива в отдельные сопоставленные объекты, используя каждый индекс массива

#sql #presto

Вопрос:

Я ни за что на свете не могу понять, как это сделать в престо. После запроса у меня есть два агрегированных массива a и b. Я хотел бы выяснить, как превратить каждый индекс массива в карту со статическими метками для каждого значения в a и b.

См., например, ниже. Я поиграл со всеми различными функциями отображения массивов в документации Presto, но, похоже, не могу этого понять. Есть какие-нибудь мысли?

Примечание: Длина a и b всегда будет одинаковой, но может варьироваться от 1 до 10

Ввод

 select
array_agg('a','b','c') as a,
array_agg(1,2,3) as b
from etc...
 

который превращается в

a b
[‘a’,’b’,’c’] [1,2,3]

Затем, после некоторой трансформации…

Желаемый Результат:

 {
    'static_label_char' -> 'a',
    'static_label_num' -> 1
},
{
    'static_label_char' -> 'b',
    'static_label_num' -> 2
},
{
    'static_label_char' -> 'c',
    'static_label_num' -> 3
}
 

Ответ №1:

Не уверен, что вы можете создать карту, содержащую различные типы в качестве значений, но вы можете заархивировать массивы и преобразовать результат в строки с именованными полями:

 SELECT transform(
  zip(a, b),
  r -> cast(r AS ROW(static_label_char CHAR, static_label_num SMALLINT)))
FROM 
    (SELECT ARRAY['a','b','c'] AS a, ARRAY[1,2,3] AS b)
 

Выход:

_col0
[{static_label_char=a, static_label_num=1}, {static_label_char=b, static_label_num=2}, {static_label_char=c, static_label_num=3}]

А затем вы можете использовать точечную нотацию для доступа к именованному полю. Например, с unnest :

 SELECT r.static_label_char, r.static_label_num
FROM 
    (SELECT transform( zip(a, b),
         r -> cast(r AS ROW(static_label_char CHAR, static_label_num SMALLINT))) AS rows
    FROM 
        (SELECT ARRAY['a','b','c'] AS a, ARRAY[1,2,3] AS b) )
CROSS JOIN UNNEST(rows) AS t (r);
 

Выход:

static_label_char static_label_num
a 1
b 2
c 3

Комментарии:

1. Хм, ладно, я поиграю с ним и посмотрю, что смогу найти. Спасибо! обновится, если я найду ответ