Как обойти следующую ошибку в Amazon Athena?
HIVE_INVALID_METADATA: com.facebook.presto.hive.DataCatalogException: Ошибка:: ожидается в позиции 8 'struct 'но' - 'найдено. (Служба: ноль; код состояния: 0; код ошибки: ноль; идентификатор запроса: ноль)
При просмотре позиции 8 в таблице базы данных, подключенной к Athena, сгенерированной AWS Glue, я вижу, что в ней есть столбец с именем attributes
с соответствующим типом данных структуры:
struct <
x-amz-request-id:string,
action:string,
label:string,
category:string,
when:string
>
Я предполагаю, что ошибка возникает из-за того, что поле attributes
не всегда заполнено (см. Событие _session.start
ниже) и не всегда содержит все поля (например, событие DocumentHandling
ниже не содержит attributes.x-amz-request-id
поле). Как правильно решить эту проблему? Можно ли сделать столбец необязательным в Glue? Может (должен?) Клей заполнить структуру пустыми строками? Другие варианты?
Фон: у меня есть следующая структура бэкэнда:
- Amazon PinPoint Analytics собирает показатели из моего приложения.
- Поток событий PinPoint настроен для пересылки событий в поток доставки Amazon Kinesis Firehose.
- Kinesis Firehose записывает данные в S3
- Используйте клей AWS для сканирования S3
- Использование Athena для написания запросов на основе баз данных и таблиц, созданных AWS Glue
Я вижу, как события PinPoint успешно добавляются в файлы json на S3, например,
Первое событие в файле:
{
"event_type": "_session.start",
"event_timestamp": 1524835188519,
"arrival_timestamp": 1524835192884,
"event_version": "3.1",
"application": {
"app_id": "[an app id]",
"cognito_identity_pool_id": "[a pool id]",
"sdk": {
"name": "Mozilla",
"version": "5.0"
}
},
"client": {
"client_id": "[a client id]",
"cognito_id": "[a cognito id]"
},
"device": {
"locale": {
"code": "en_GB",
"country": "GB",
"language": "en"
},
"make": "generic web browser",
"model": "Unknown",
"platform": {
"name": "macos",
"version": "10.12.6"
}
},
"session": {
"session_id": "[a session id]",
"start_timestamp": 1524835188519
},
"attributes": {},
"client_context": {
"custom": {
"legacy_identifier": "50ebf77917c74f9590c0c0abbe5522d2"
}
},
"awsAccountId": "672057540201"
}
Второе событие в том же файле:
{
"event_type": "DocumentHandling",
"event_timestamp": 1524835194932,
"arrival_timestamp": 1524835200692,
"event_version": "3.1",
"application": {
"app_id": "[an app id]",
"cognito_identity_pool_id": "[a pool id]",
"sdk": {
"name": "Mozilla",
"version": "5.0"
}
},
"client": {
"client_id": "[a client id]",
"cognito_id": "[a cognito id]"
},
"device": {
"locale": {
"code": "en_GB",
"country": "GB",
"language": "en"
},
"make": "generic web browser",
"model": "Unknown",
"platform": {
"name": "macos",
"version": "10.12.6"
}
},
"session": {},
"attributes": {
"action": "Button-click",
"label": "FavoriteStar",
"category": "Navigation"
},
"metrics": {
"details": 40.0
},
"client_context": {
"custom": {
"legacy_identifier": "50ebf77917c74f9590c0c0abbe5522d2"
}
},
"awsAccountId": "[aws account id]"
}
Затем AWS Glue создал базу данных и таблицу. В частности, я вижу, что есть столбец с именем attributes
, который имеет значение
struct <
x-amz-request-id:string,
action:string,
label:string,
category:string,
when:string
>
Однако, когда я пытаюсь Preview table
из Афины, то есть выполнить запрос
SELECT * FROM "pinpoint-test"."pinpoint_testfirehose" limit 10;
Я получаю сообщение об ошибке, описанное ранее.
Примечание: я пытался удалить поле attributes
(редактируя таблицу базы данных из Glue), но это приводит к Internal error
при выполнении SQL-запроса из Афины.