在 Amazon Athena 上为地图属性创建表
Posted
技术标签:
【中文标题】在 Amazon Athena 上为地图属性创建表【英文标题】:Creating Table on Amazon Athena for Map Attributes 【发布时间】:2017-07-26 21:28:45 【问题描述】:我正在尝试从源自 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。这是我拥有的表格,但它没有分隔字段,
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')
谢谢
【问题讨论】:
你错过了什么?表结构与您的 JSON 匹配,那么“它不分隔字段”是什么意思? 当我运行查询时,payload 属性在一个字段上显示所有 JSON 格式的值,我想在他自己的字段中获取每个值。也许是我正在运行的查询的问题 【参考方案1】:您描述的问题在于您正在执行的查询。如果您只是运行select *
,则结果是组合的 JSON。
要将元素选择为单个列,您需要单独选择它们:
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 Athena 上为地图属性创建表的主要内容,如果未能解决你的问题,请参考以下文章
如何将带有 NULL 值的引用 CSV 读入 Amazon Athena