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.