Элементы в предложении FROM подзапросов агрегирования должны ссылаться на вложенные таблицы предложений FROM более высокого уровня.

У меня есть данные, записываемые в AWS S3 через kafka, поэтому сообщение может быть записано более одного раза. Я использую Spectrum Redshift для его запроса.

Поскольку данные вложены, я столкнулся с некоторыми ограничениями, описанными в документация, но я не могу найти способ ее дедупликации.

Сначала я попытался избавиться от дубликатов с помощью group by, а затем выполнил обычную агрегацию

with rid_of_duplicates as (
select table.field_1, table.struct_1.field_2, table.struct_1.field_3
from table
group by 1,2,3 
)

select field_1 || field_2, count(field_3)
from rid_of_duplicates
group by field_1, field_2

Но я получаю следующую ошибку

ОШИБКА: Ошибка вложенного запроса Spectrum Подробно: ------------------------------------------ ----- ошибка: код ошибки вложенного запроса Spectrum: 8001 контекст: элементы в предложении FROM подзапросов агрегирования должны ссылаться на вложенные таблицы предложений FROM более высокого уровня. запрос: 0 расположение: nested_query_rewriter.cpp: 814 процесс: padbmaster [pid = 6630] ----------

Если я избавлюсь от GROUP BY в подзапросе, запрос будет работать нормально, но его результат будет неправильным.

Читая документы, кажется, что я не предполагалось выбирать определенные поля в подзапросе. Но поскольку я использую вложенные данные, я не могу использовать SELECT *.

Я также попытался создать представление без привязки к схеме, но это тоже не удалось. SELECT Distinct тоже не работает

Если возможно, я бы не хотел создавать для этого таблицу, поскольку данные хранятся в S3. Кроме того, счетчик (отдельное поле_3) не работает из-за бизнес-логики


person Lucas Abreu    schedule 03.09.2020    source источник


Ответы (1)


Решение, которое я нашел для этого, - установить для json_serialization значение TRUE для сеансов, таким образом Redshift настраивает все данные на поведение json, а затем вы можете работать с ним, как если бы это была обычная таблица. Документы

SET json_serialization_enable TO true;

В моем случае мои данные были чистой структурой, а не массивом структур (что позволило бы объединить, упомянутое в варианты использования для объединенных данных)

person Lucas Abreu    schedule 04.09.2020