HIVE_INVALID_METADATA в Amazon Athena

Как обойти следующую ошибку в 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 из Афины.


person matsev    schedule 02.05.2018    source источник


Ответы (3)


Это известное ограничение. Имена таблиц и баз данных Athena допускают использование только специальных символов подчеркивания #

Имена таблиц и баз данных Athena не могут содержать специальные символы, кроме подчеркивания (_). Источник: http://docs.aws.amazon.com/athena/latest/ug/known-limitations.html

person vr00n    schedule 10.05.2018

Используйте галочку (`), если в имени таблицы есть - Пример: SELECT * FROM` pinpoint-test`.`pinpoint_testfirehose` limit 10;

Убедитесь, что вы выбрали базу данных «по умолчанию» на левой панели.

person Kiran Kandala    schedule 03.08.2018

Я считаю, что проблема в вашем имени элемента структуры: x-amz-request-id - в имени. В настоящее время я сталкиваюсь с аналогичной проблемой, так как мои элементы в моей структуре имеют :: в имени.
Примеры данных:

some_key: {
  "system::date": date,
  "system::nps_rating": 0
}

Склейте производную схему структуры (она пыталась избежать их с помощью):

struct <
    system\:\:date:String
    system\:\:nps_rating:Int
>

Но это по-прежнему вызывает ошибку в Athena.
У меня нет хорошего решения для этого, кроме изменения Struct на STRING и попытки обработать данные таким образом.

person Wojciech    schedule 21.08.2020