在 Amazon Athena 上为地图属性创建 Table
Creating Table on Amazon Athena for Map Attributes
我正在尝试从源自 Amazon DynamoDB 的 JSON 文件中获取所有属性。现在我将文件发送到 Amazon S3 存储桶并使用 Amazon Athena 读取它。这是来自 JSON 文件的示例,
{
"Items": [
{
"payload": {
"phase": "T",
"tms_event": "2017-03-16 18:19:50",
"id_UM": 0,
"num_severity_level": 0,
"event_value": 1,
"int_status": 0
},
"deviceId": 6,
"tms_event": "2017-03-16 18:19:50"
}
]
}
我希望在不同的字段中获取 deviceId、tms_event、phase、id_UM 和 event_value。这是我的 table,但它没有分隔字段,
CREATE EXTERNAL TABLE IF NOT EXISTS default.iot_table (
`Items` ARRAY<
STRUCT<
`payload`: STRUCT<`phase`: string, `tms_event`: string, `id_UM`: int, `num_severity_level`: int, `event_value`: int, `int_status`: int>,
`deviceId`: int,
`tms_event`: string
>
>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1'
) LOCATION 's3://iot-logging/'
TBLPROPERTIES ('has_encrypted_data'='false')
谢谢
您描述的问题存在于您正在执行的查询中。如果你只是运行一个select *
,结果就是一个组合JSON.
要select将元素作为单列,您需要单独select它们:
select item.deviceId,item.tms_event, item.payload.phase,
item.payload.id_UM, item.payload.event_value
from iot_table
CROSS JOIN UNNEST(iot_table.Items) AS t (item);
由于您的第一个元素是一个数组并且可以包含多个项目,因此需要交叉连接。
我正在尝试从源自 Amazon DynamoDB 的 JSON 文件中获取所有属性。现在我将文件发送到 Amazon S3 存储桶并使用 Amazon Athena 读取它。这是来自 JSON 文件的示例,
{
"Items": [
{
"payload": {
"phase": "T",
"tms_event": "2017-03-16 18:19:50",
"id_UM": 0,
"num_severity_level": 0,
"event_value": 1,
"int_status": 0
},
"deviceId": 6,
"tms_event": "2017-03-16 18:19:50"
}
]
}
我希望在不同的字段中获取 deviceId、tms_event、phase、id_UM 和 event_value。这是我的 table,但它没有分隔字段,
CREATE EXTERNAL TABLE IF NOT EXISTS default.iot_table (
`Items` ARRAY<
STRUCT<
`payload`: STRUCT<`phase`: string, `tms_event`: string, `id_UM`: int, `num_severity_level`: int, `event_value`: int, `int_status`: int>,
`deviceId`: int,
`tms_event`: string
>
>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1'
) LOCATION 's3://iot-logging/'
TBLPROPERTIES ('has_encrypted_data'='false')
谢谢
您描述的问题存在于您正在执行的查询中。如果你只是运行一个select *
,结果就是一个组合JSON.
要select将元素作为单列,您需要单独select它们:
select item.deviceId,item.tms_event, item.payload.phase,
item.payload.id_UM, item.payload.event_value
from iot_table
CROSS JOIN UNNEST(iot_table.Items) AS t (item);
由于您的第一个元素是一个数组并且可以包含多个项目,因此需要交叉连接。