2017-09-21 4 views
0

Ich habe folgendes Json-Objekt für eine Teilnahme der Person zu Konferenzen:Amazon Athena - Nested JSON gibt

{"conferences_attended": [ 
      {"conference_name": "dreamforce", 
      "date": "2017", 
      "city": "san francisco", 
      "state": "ca"}, 
      {"conference_name": "RampUp", 
      "date": "2016", 
      "city": "san francisco", 
      "state": "ca"}, 
      ], 
    "last_name" : "doe"} 

ich den folgenden Code ausführen haben Tabelle zu erstellen, zeigt auf, wo ich die in s3 gespeicherten Daten

CREATE EXTERNAL TABLE IF NOT EXISTS my_db.attendees (
     `last_name` string, 
     `conferences_attended` array< struct< 
      conference_name:string, 
      date:string, 
      city:string, 
      state:string, 
     >>, 
    ) 
    ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
    WITH SERDEPROPERTIES (
     'serialization.format' = '1' 
    ) LOCATION 's3://**' 
    TBLPROPERTIES ('has_encrypted_data'='false'); 

Jetzt habe ich 2 Teile zu meiner Frage.

1) Wie frage ich ab, um auf die Daten zuzugreifen, die in verschachtelten JSON-Objekten enthalten sind? Die beiden folgenden Abfragen funktionieren nicht und auch nicht viele ähnliche.

SELECT conferences_attended 
    FROM attendees; 

    SELECT conferences_attended.conference_name 
    FROM attendees; 

2) Wie kann ich Abfrage-Ergebnisse nur einen bestimmten Teil des verschachtelten json passend zu kommen?

SELECT * 
    FROM attendees 
    WHERE conferences_attended.conference_name like '%force%'; 

ich Fehler bin immer das mich führt zu glauben, ich brauche die Daten Datentypen oder un-Nest zu ändern oder etwas similr ... Danke für die Hilfe und Links zu Informationen über diese Art von Aktionen zu unterstützen. Hinweis, ich habe die folgenden Links gelesen und fand sie hilfreich, aber immer noch nicht meine Bedürfnisse zu lösen. http://docs.aws.amazon.com/athena/latest/ug/rows-and-structs.html und http://thornydev.blogspot.com/2013/07/querying-json-records-via-hive.html und viele andere ...

Schließlich irgendwelche Ratschläge oder Ressourcen für die Unterschiede zwischen ‚org.apache.hive.hcatalog.data.JsonSerDe‘ und ‚org.openx.data.jsonserde.JsonSerDe‘ sind willkommen .

Antwort

0

Erstens stimmen die Felder in Ihrer externen Tabelle nicht mit den Feldern in der JSON-Datei überein, auf die Sie verweisen möchten.

Wie es scheint, sollten Sie Ihre Tabellendefinition wie folgt lauten:

CREATE EXTERNAL TABLE IF NOT EXISTS my_db.attendees (
    `last_name` string, 
    `conferences_attended` array<struct<conference_name:string, 
    date:string, city:string, state:string>>, 
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
WITH SERDEPROPERTIES (
    'serialization.format' = '1' 
) LOCATION 's3://**' 
TBLPROPERTIES ('has_encrypted_data'='false'); 

Sie haben company_name und linkedin_company_id als Felder conferences_attended erwähnt, während Sie andere Felder zuzugreifen versuchen.

Danach können Sie die Felder in der folgenden Art und Weise zuzugreifen:

SELECT conferences_attended 
FROM attendees; 

Da jedoch conferences_attended ist ein Array von Strukturen, müssen Sie Array-Index erwähnen die Felder dieser besonderen Struktur des Arrays zuzugreifen . Anstatt also diese:

SELECT conferences_attended.conference_name 
FROM attendees; 

so etwas wie dieses Versuchen:

SELECT conferences_attended[1].conference_name FROM attendees; 

Nun, wenn Sie alle Strukturen innerhalb des Arrays analysieren wollen und einige Filter auf Daten anwenden, können Sie es tun, um die UNNEST mit Funktion auf folgende Weise:

SELECT 
last_name, 
conferences.conference_name, 
conferences.date, 
conferences.city, 
conferences.state 
FROM 
attendees CROSS JOIN UNNEST(conferences_attended) as t(conferences) 
WHERE 
conferences.conference_name like '%force%'; 

Sie können den folgenden Link für weitere Referenzen verweisen: http://docs.aws.amazon.com/athena/latest/ug/flattening-arrays.html

Verwandte Themen