Athena: как получить значение на основе отфильтрованного индекса в массиве структур

У меня есть таблица S3 (тест) со столбцом (образцом) в массиве формата структуры.

[{index=1, value='A'}, {index=2, value='B'}, {index=3, value='F'}, ...]

Я попробовал этот запрос, и он работает:

SELECT 
date, 
MAX(case when s.index = 1 then s.value else NULL end) AS a1,
MAX(case when s.index = 3 then s.value else NULL end) as a2
FROM test,
UNNEST(sample) AS t(s)
group by date;

Есть ли способ сделать то же самое без использования unnest (например, с помощью функции фильтра)?


person Yasamine    schedule 30.07.2019    source источник
comment
Вы должны иметь возможность комбинировать filter (prestosql.io/docs/0.172/functions/ lambda.html#filter), transform (prestosql.io/docs /0.172/functions/lambda.html#transform) и array_max (prestosql.io/docs/0.172/functions/array.html#array_max). (Поскольку Athena основана на Presto 0.172, я даю ссылки на документы для этой версии).   -  person Piotr Findeisen    schedule 31.07.2019


Ответы (1)


Используйте функции массива для обработки массивов:

SELECT
  date,
  MAX(array_max(transform(filter(sample, e -> e.index = 1), e -> e.value))) AS a1,
  MAX(array_max(transform(filter(sample, e -> e.index = 3), e -> e.value))) AS a2,
FROM test
GROUP BY 1

filter выбирает элементы с нужным вам индексом, transform извлекает value свойства из выбранных элементов, а array_max возвращает максимальное значение.

person Theo    schedule 01.08.2019
comment
когда я запускаю его, выдает эту ошибку: array_max(transform(filter(sample, (e) -> (e.index = 1)), (e) -> e.value))' должен быть совокупным выражением или появляться в Предложение GROUP BY - person Yasamine; 02.08.2019
comment
Извините, я забыл, что вам нужно также обернуть его в MAX, чтобы получить максимальное значение по всем строкам, а не только максимальное значение для каждой строки. Я обновил свой пример. - person Theo; 02.08.2019
comment
да правильно, работает отлично. На самом деле, если группа удалена, нам не нужно оборачивать ее в MAX... большое спасибо - person Yasamine; 02.08.2019
comment
Группировка существует, поэтому вы получите максимальное значение за дату, без нее вы получите несколько строк для одной и той же даты. - person Theo; 02.08.2019