如何从Amazon S3查询数据

时间:2017-07-15 01:37:30

标签: amazon-s3 amazon-dynamodb aws-lambda amazon-redshift amazon-athena

我希望创建一个包含源自Amazon DynamoDB的数据的Tableau Dashboard。现在我使用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查询时,我没有得到任何结果。

这是Athena 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')

谢谢, 亚历

1 个答案:

答案 0 :(得分:3)

您的表格看起来与您的数据不符,因为您的数据有一个顶级Items数组。在不重构JSON数据文件的情况下,我认为您需要这样的表定义:

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;