如何从 Amazon S3 查询数据

How to querying data from Amazon S3

我希望使用源自 Amazon DynamoDB 的数据创建一个 Tableau 仪表板。现在我正在使用 Amazon Lambda 将数据发送到 Amazon S3 上的一个存储桶,我正在 S3 存储桶上获取这个文件,

{
  "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"
    }
  ]
}

我尝试使用 Amazon Athena 创建与 Tableau 的连接,但有效负载属性给我带来了问题,我在执行 SELECT 查询时没有得到任何结果。

这是雅典娜 Table,

CREATE EXTERNAL TABLE IF NOT EXISTS default.iot_table_test (
  `payload` map<string,string>,
  `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')

谢谢, 亚历杭德罗

您的 table 看起来与您的数据不匹配,因为您的数据具有顶级 Items 数组。如果不重构 JSON 数据文件,我认为您需要这样的 table 定义:

CREATE EXTERNAL TABLE IF NOT EXISTS default.iot_table_test_items (
  `Items` ARRAY<
    STRUCT<
      `payload`: MAP<string, string>,
      `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')

然后查询它取消嵌套 Items 数组:

SELECT 
  item.deviceId, 
  item.tms_event, 
  item.payload
FROM 
  default.iot_table_test_items
  CROSS JOIN UNNEST (Items) AS i (item)
LIMIT 10;