0

我想從源自Amazon DynamoDB的JSON文件中獲取所有屬性。現在,我將文件發送到Amazon S3存儲桶並使用Amazon Athena閱讀。這是從JSON文件的示例,在Amazon Athena上創建映射屬性表

{ 
    "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,相位,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') 

感謝

+0

這是什麼,你錯過了?表結構與您的JSON相匹配,那麼「它不分隔字段」是什麼意思? –

+0

當我運行查詢時,有效載荷屬性在一個字段中顯示JSON格式的所有值,我想要在他自己的字段中獲取每個值。也許是我正在運行的查詢的問題 –

回答

0

問題你描述您正在執行的查詢中的謊言。如果您剛剛運行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); 

的交叉連接需要因爲事實上,你的第一個元素是一個數組,可以包含多個項目。