HIVE_INVALID_METADATA 在亚马逊雅典娜
HIVE_INVALID_METADATA in Amazon Athena
如何解决 Amazon Athena 中的以下错误?
HIVE_INVALID_METADATA: com.facebook.presto.hive.DataCatalogException: Error: : expected at the position 8 of 'struct<x-amz-request-id:string,action:string,label:string,category:string,when:string>' but '-' is found. (Service: null; Status Code: 0; Error Code: null; Request ID: null)
当查看连接到 AWS Glue 生成的 Athena 的数据库 table 中的位置 8 时,我可以看到它有一个名为 attributes
的列,具有相应的结构数据类型:
struct <
x-amz-request-id:string,
action:string,
label:string,
category:string,
when:string
>
我的猜测是错误的发生是因为 attributes
字段并不总是被填充(c.f。下面的 _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 生成的数据库和 tables 的查询
我可以看到 PinPoint 事件已成功添加到 S3 中的 json 文件中,例如
文件中的第一个事件:
{
"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 生成了一个数据库和一个 table。具体来说,我看到有一个名为 attributes
的列,其值为
struct <
x-amz-request-id:string,
action:string,
label:string,
category:string,
when:string
>
但是,当我尝试从 Athena Preview table
,即执行查询时
SELECT * FROM "pinpoint-test"."pinpoint_testfirehose" limit 10;
我收到前面描述的错误消息。
旁注,我试图删除 attributes
字段(通过从 Glue 编辑数据库 table),但是在执行 [=63= 时会导致 Internal error
] 来自 Athena 的查询。
这是一个已知的限制。 Athena table 和数据库名称只允许下划线特殊字符#
Athena table 和数据库名称不能包含特殊字符,下划线 (_) 除外。
资料来源:http://docs.aws.amazon.com/athena/latest/ug/known-limitations.html
当 table 名称中有 - 时使用勾号 (`)
例子:
SELECT * 来自 `pinpoint-test`.`pinpoint_testfirehose` 限制 10;
确保 select "default" 数据库在左窗格中。
我认为问题出在您的结构元素名称:x-amz-request-id
名称中的“-”。
我目前正在处理类似的问题,因为我的结构中的元素名称中有“::”。
示例数据:
some_key: {
"system::date": date,
"system::nps_rating": 0
}
胶水派生结构模式(它试图用 转义它们):
struct <
system\:\:date:String
system\:\:nps_rating:Int
>
但这仍然让我在 Athena 中出错。
除了将 Struct 更改为 STRING 并尝试以这种方式处理数据外,我没有好的解决方案。
如何解决 Amazon Athena 中的以下错误?
HIVE_INVALID_METADATA: com.facebook.presto.hive.DataCatalogException: Error: : expected at the position 8 of 'struct<x-amz-request-id:string,action:string,label:string,category:string,when:string>' but '-' is found. (Service: null; Status Code: 0; Error Code: null; Request ID: null)
当查看连接到 AWS Glue 生成的 Athena 的数据库 table 中的位置 8 时,我可以看到它有一个名为 attributes
的列,具有相应的结构数据类型:
struct <
x-amz-request-id:string,
action:string,
label:string,
category:string,
when:string
>
我的猜测是错误的发生是因为 attributes
字段并不总是被填充(c.f。下面的 _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 生成的数据库和 tables 的查询
我可以看到 PinPoint 事件已成功添加到 S3 中的 json 文件中,例如
文件中的第一个事件:
{
"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 生成了一个数据库和一个 table。具体来说,我看到有一个名为 attributes
的列,其值为
struct <
x-amz-request-id:string,
action:string,
label:string,
category:string,
when:string
>
但是,当我尝试从 Athena Preview table
,即执行查询时
SELECT * FROM "pinpoint-test"."pinpoint_testfirehose" limit 10;
我收到前面描述的错误消息。
旁注,我试图删除 attributes
字段(通过从 Glue 编辑数据库 table),但是在执行 [=63= 时会导致 Internal error
] 来自 Athena 的查询。
这是一个已知的限制。 Athena table 和数据库名称只允许下划线特殊字符#
Athena table 和数据库名称不能包含特殊字符,下划线 (_) 除外。 资料来源:http://docs.aws.amazon.com/athena/latest/ug/known-limitations.html
当 table 名称中有 - 时使用勾号 (`) 例子: SELECT * 来自 `pinpoint-test`.`pinpoint_testfirehose` 限制 10;
确保 select "default" 数据库在左窗格中。
我认为问题出在您的结构元素名称:x-amz-request-id
名称中的“-”。
我目前正在处理类似的问题,因为我的结构中的元素名称中有“::”。
示例数据:
some_key: {
"system::date": date,
"system::nps_rating": 0
}
胶水派生结构模式(它试图用 转义它们):
struct <
system\:\:date:String
system\:\:nps_rating:Int
>
但这仍然让我在 Athena 中出错。
除了将 Struct 更改为 STRING 并尝试以这种方式处理数据外,我没有好的解决方案。