在 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 上为地图属性创建表的主要内容,如果未能解决你的问题,请参考以下文章

Amazon Athena 表创建问题

如何从 Amazon Athena 查询镶木地板数据?

amazon athena 创建带分区的请求

如何将带有 NULL 值的引用 CSV 读入 Amazon Athena

Amazon Athena - 在基本 SQL WHERE 查询中无法解析列

Amazon athena 无法读取 S3 Access 日志文件,Athena 选择查询为每一列返回空结果集