Как обойти следующую ошибку в Amazon Athena?
HIVE_INVALID_METADATA: com.facebook.presto.hive.DataCatalogException: Error:: ожидается на позиции 8 в 'struct ‹x-amz-request-id: string, action: string, label: string, category: string, when: string› 'но' - 'найдено. (Служба: null; Код состояния: 0; Код ошибки: null; Идентификатор запроса: null)
Глядя на позицию 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 Glue для сканирования 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 из Афины.