0

我正在创建一个Tableau Dashboard,其中包含源自Amazon DynamoDB的数据。现在,我使用Amazon LAMBDA将数据发送到亚马逊S3水桶和我得到这个文件的S3桶,如何查询Amazon 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雅典娜创建的Tableau连接,但有效载荷属性是给我的问题,我没有得到任何结果,当我做SELECT查询。

这是雅典娜表,

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') 

谢谢,亚历杭德罗·

回答

2

您的表看起来并不像它匹配您的数据,因为你的数据具有顶级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') 

,然后查询它unnesting Items数组:

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

嗨詹姆斯,谢谢。我从他的查询中获得结果。现在我正在尝试(不成功)使用新表来分割列“有效内容”中的值 –