2025, Dec 12 00:02
Массив структур в aws_glue_alpha для AWS Glue: рабочий способ
Разберем, как корректно описать массив структур (array<struct>) в aws_glue_alpha для таблиц AWS Glue: рабочий подход через дескриптор типа и пример кода.
Определить столбец как массив структур в таблице AWS Glue кажется простой задачей, пока не сталкиваешься с актуальным конструктом aws_glue_alpha. API позволяет описывать типы, но форма «массив структур» не представлена как прямой вызов struct внутри array, как многие ожидают. Если вы пробовали вложить struct(...) прямо в array(...), скорее всего упёрлись в ограничение.
Что мы хотим выразить
Конструкт явно поддерживает оболочку массива, но только если передать ему низкоуровневое описание типа. Это выглядит так:
glue.Schema.array( input_string='struct', is_primitive=False,)Инстинктивно хочется использовать вложенную форму, которая отражает логическую структуру данных:
glue.Schema.array( glue.Schema.struct( columns=[...] ))Идея верная, но в этом месте конструкт не принимает экземпляр struct напрямую.
Почему так происходит
Ключ в том, что именно возвращают билдеры типов. Каждый помощник схемы отдаёт объект Type с двумя полями: inputString и isPrimitive. Фабрика array(...) использует эти свойства, чтобы описать тип элемента. Иными словами, array(...) не принимает вложенный вызов билдера struct; он ждёт базовый дескриптор типа, который сам бы получил из этой структуры.
Рабочий подход
Сначала соберите структуру один раз и сохраните её дескриптор. Затем передайте оба свойства в array(...). Этого достаточно, чтобы конструктор массива корректно выразил array<struct<...>>.
# один раз создаём форму структурыcompound_shape = glue.Schema.struct( columns=[...] )# передаём её дескриптор в array(...)array_of_compound = glue.Schema.array( input_string=compound_shape.input_string, is_primitive=compound_shape.is_primitive,)Семантика остаётся точной: тип элемента массива — это определённая вами структура; при этом вы не дублируете схему и не скатываетесь к строковым ухищрениям.
Но я видел код вроде array(struct(...)) — почему он работает?
Когда такой код как будто работает, под капотом важна именно пара inputString и isPrimitive, которую выдаёт внутренний билдер struct. Фабрика типа массива опирается на эти два поля. Сделав их явными, вы снимаете двусмысленность и совпадаете с тем, как конструкт представляет типы внутри.
Почему это важно
Определения схем живут долго и лежат в основе системы. Если сразу задать форму «массив структур» корректно, не будет расхождений между задуманной структурой и тем, что попадёт в каталог. К тому же ваш CDK‑код останется устойчивым к изменениям в проверке аргументов у помощников, потому что вы передаёте ровно то, что ожидает фабрика массива.
Выводы
Опишите структуру один раз и передайте её дескриптор типу массива. Если ловите себя на попытке вкладывать билдеры напрямую, остановитесь и раскройте два поля, которые нужны вызову array(...). Так схема таблицы Glue останется точной, явно определённой и готовой к будущим изменениям в рамках текущего поведения aws_glue_alpha.