AWS Glue - Добавление fileld в поле struct - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть таблица, определенная в AWS Glue. Я использую потоки AWS Kinesis для потоковой передачи журналов в S3, используя это определение таблицы, используя формат файла паркета. Он разделен по дате.

Одним из полей в таблице является структура с несколькими полями, event_payload, одно из которых - массив структур. Недавно я добавил новое поле во внутреннюю структуру данных журнала. Я хочу добавить его в определение таблицы, чтобы он был записан в S3, и чтобы я мог запросить его с помощью AWS Athena.

Я попытался редактировать схему таблицы непосредственно в консоли. Он записывает данные в S3, но я получаю исключение в Афине при запросе:

HIVE_PARTITION_SCHEMA_MISMATCH: There is a mismatch between the table and partition schemas. The types are incompatible and cannot be coerced. The column 'event_payload' in table 'c2s.logs' is declared as type 'struct<...>', but partition 'year=2019/month=201910/day=20191026/hour=2019102623' declared column 'event_payload' as type 'struct<...>'.

Я попытался удалить все разделы и восстановить таблицу, как указано здесь , но я получил другую ошибку:

HIVE_CANNOT_OPEN_SPLIT: Error opening Hive split s3://.../year=2019/month=201910/day=20191022/hour=2019102216/beaconFirehose-4-2019-10-22-16-34-21-71f183d2-207e-4ae9-98fe-07dda0bab70c.parquet (offset=0, length=801679): Schema mismatch, metastore schema for row column event_payload.markings.element has 8 fields but parquet schema has 7 fields

Итак, в схеме есть поле, которого нет в данных. Есть ли способ указать необязательное поле? Если его нет, просто сделайте его пустым.

1 Ответ

1 голос
/ 05 ноября 2019

Согласно ссылка Обновления схемы во вложенной структуре не поддерживаются в Афине. Одним из способов сделать эту работу может быть выравнивание типа структуры с помощью оператора relalaionalize в Glue. Например:

val frames: Seq[DynamicFrame] = lHistory.relationalize(rootTableName = "hist_root", stagingPath = redshiftTmpDir, JsonOptions.empty)
...