2017-02-03 4 views
8

Ich habe einige JSON-Dateien in einem S3-Bucket gespeichert, wobei jede Datei mehrere Elemente der gleichen Struktur hat. Zum BeispielSpeichern Sie mehrere Elemente in JSON-Dateien in AWS Athena

[{"eventId":"1","eventName":"INSERT","eventVersion":"1.0","eventSource":"aws:dynamodb","awsRegion":"us-west-2","image":{"Message":"New item!","Id":101}},{"eventId":"2","eventName":"MODIFY","eventVersion":"1.0","eventSource":"aws:dynamodb","awsRegion":"us-west-2","image":{"Message":"This item has changed","Id":101}},{"eventId":"3","eventName":"REMOVE","eventVersion":"1.0","eventSource":"aws:dynamodb","awsRegion":"us-west-2","image":{"Message":"This item has changed","Id":101}}] 

Ich möchte eine Tabelle in Athena entsprechend den oben genannten Daten erstellen.

Die Abfrage, die ich für die Erstellung der Tabelle geschrieben:

CREATE EXTERNAL TABLE IF NOT EXISTS sampledb.elb_logs2 (
    `eventId` string, 
    `eventName` string, 
    `eventVersion` string, 
    `eventSource` string, 
    `awsRegion` string, 
    `image` map<string,string> 
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
WITH SERDEPROPERTIES (
    'serialization.format' = '1', 
    'field.delim' = ' ' 
) LOCATION 's3://<bucketname>/'; 

Aber wenn ich eine SELECT-Abfrage wie folgt tun,

SELECT * FROM sampledb.elb_logs4; 

ich folgendes Ergebnis:

1 {"eventid":"1","eventversion":"1.0","image":{"id":"101","message":"New item!"},"eventsource":"aws:dynamodb","eventname":"INSERT","awsregion":"us-west-2"} {"eventid":"2","eventversion":"1.0","image":{"id":"101","message":"This item has changed"},"eventsource":"aws:dynamodb","eventname":"MODIFY","awsregion":"us-west-2"} {"eventid":"3","eventversion":"1.0","image":{"id":"101","message":"This item has changed"},"eventsource":"aws:dynamodb","eventname":"REMOVE","awsregion":"us-west-2"} 

Der gesamte Inhalt der JSON-Datei wird hier als ein Eintrag ausgewählt.

Wie kann ich jedes Element der JSON-Datei als einen Eintrag lesen?

Bearbeiten: Wie kann ich jede Unterspalte des Bildes, d. H. Jedes Element der Karte lesen?

Danke.

Antwort

9

Question1: Shop mehr Elemente in json Dateien für AWS Athena

Ich brauche meine JSON-Datei als

{ "eventId" neu zu schreiben: "1", "eventname": "INSERT", "eventVersion": "1.0", "eventSource": "aws: dynamodb", "awsRegion": "us-west-2", "image": {"Nachricht": "Neuer Artikel!", "Id": 101 }}, {"eventId": "2", "eventName": "MODIFY", "eventVersion": "1.0", "eventSource": "aws: dynamodb", "awsRegion": "us-west-2", "Bild": {"Nachricht": "Dieser Artikel hat sich geändert", "Id": 101}}, {"eventId": "3", "eventName": "ENTFERNEN", "eventVersion": "1.0", " eventSource ":" aws: dynamodb "," awsRegion ":" us-west-2 "," Bild ": {" Nachricht ":" Dieser Artikel wurde geändert "," Id ": 101} }

Das bedeutet

die eckigen Klammern entfernen [] jedes Element in einer Zeile

{.....................} 
{.....................} 
{.....................} 

Question2 halten. Zugang nichtlineare json Attribute

CREATE EXTERNAL TABLE IF NOT EXISTS <tablename> (
    `eventId` string, 
    `eventName` string, 
    `eventVersion` string, 
    `eventSource` string, 
    `awsRegion` string, 
    `image` struct <`Id` : string, 
        `Message` : string> 
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
WITH SERDEPROPERTIES (
    'serialization.format' = '1', 
    "dots.in.keys" = "true" 
) LOCATION 's3://exampletablewithstream-us-west-2/'; 

Abfrage:

select image.Id, image.message from <tablename>; 

Ref:

http://engineering.skybettingandgaming.com/2015/01/20/parsing-json-in-hive/

https://github.com/rcongiu/Hive-JSON-Serde#mapping-hive-keywords

+0

ich habe das gleiche Problem wie Q1 wie meine Daten von sendgrid kommt und Ich habe nicht viel Auswahl über das Datenformat :( – CpILL

Verwandte Themen