Best practice per la lettura di dati JSON - Amazon Athena

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Best practice per la lettura di dati JSON

JavaScript Object Notation (JSON) è un metodo comune per codificare le strutture di dati come testo. Molte applicazioni e numerosi strumenti restituiscono dati con codifica JSON.

In Amazon Athena, è possibile creare tabelle da dati esterni e includervi i dati con codifica JSON. Per tali tipi di dati di origine, utilizza Athena insieme a Librerie JSON SerDe .

Segui i seguenti suggerimenti per leggere i dati con codifica JSON:

  • Scegli quello giusto SerDe, un JSON nativo o un SerDe org.openx.data.jsonserde.JsonSerDe OpenX SerDeorg.apache.hive.hcatalog.data.JsonSerDe,. Per ulteriori informazioni, consulta Librerie JSON SerDe .

  • Assicurati che ogni record con codifica JSON sia rappresentato su una riga separata, non formattata.

    Nota

    SerDe Si aspetta che ogni documento JSON si trovi su una singola riga di testo senza caratteri di terminazione di riga che separano i campi del record. Se il testo JSON è in un bel formato di stampa, potresti ricevere un messaggio di errore come HIVE_CURSOR_ERROR: Row is not a valid JSON Object o HIVE_CURSOR_ERROR:: Unexpected end-of-input: expected: expected close marker for OBJECT quando tenti di interrogare la tabella dopo averla JsonParseException creata. Per ulteriori informazioni, consulta JSON Data Files nella documentazione di SerDe OpenX su. GitHub

  • Genera i dati con codifica JSON in colonne con distinzione tra maiuscole e minuscole.

  • Fornisci un'opzione per ignorare i record in formato errato, come in questo esempio.

    CREATE EXTERNAL TABLE json_table ( column_a string, column_b int ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ('ignore.malformed.json' = 'true') LOCATION 's3://DOC-EXAMPLE-BUCKET/path/';
  • Converti i campi nei dati di origine che hanno uno schema indeterminato in stringhe con codifica JSON in Athena.

Quando Athena crea tabelle basate su dati con codifica JSON, analizza i dati in base allo schema esistente e predefinito. Tuttavia, è possibile che non tutti i dati presentino uno schema predefinito. In questi casi, per semplificare la gestione degli schemi, spesso è consigliabile convertire i campi in dati di origine che dispongano di uno schema indeterminato su stringhe JSON in Athena, per poi utilizzare Librerie JSON SerDe .

Prendiamo ad esempio in considerazione un'applicazione IoT che pubblica eventi con campi comuni da diversi sensori. Uno di tali campi devono archiviare un payload personalizzato univoco per il sensore che invia l'evento. In questo caso, poiché lo schema non è noto, è consigliabile archiviare le informazioni in forma di stringa con codifica JSON. A tale scopo, occorre convertire i dati nella tabella Athena in JSON, come nell'esempio seguente. È inoltre possibile convertire i dati con codifica JSON in tipi di dati Athena.

Conversione di tipi di dati Athena in JSON

Per convertire i tipi di dati Athena in JSON, utilizza CAST.

WITH dataset AS ( SELECT CAST('HELLO ATHENA' AS JSON) AS hello_msg, CAST(12345 AS JSON) AS some_int, CAST(MAP(ARRAY['a', 'b'], ARRAY[1,2]) AS JSON) AS some_map ) SELECT * FROM dataset

Questa query restituisce:

+-------------------------------------------+ | hello_msg | some_int | some_map | +-------------------------------------------+ | "HELLO ATHENA" | 12345 | {"a":1,"b":2} | +-------------------------------------------+

Conversione di tipi di dati JSON in Athena

Per convertire i dati JSON nei tipi di dati Athena, utilizza CAST.

Nota

In questo esempio, per indicare le stringhe con codifica JSON, inizia con la parola chiave JSON e utilizza virgolette singole, ad esempio JSON '12345'

WITH dataset AS ( SELECT CAST(JSON '"HELLO ATHENA"' AS VARCHAR) AS hello_msg, CAST(JSON '12345' AS INTEGER) AS some_int, CAST(JSON '{"a":1,"b":2}' AS MAP(VARCHAR, INTEGER)) AS some_map ) SELECT * FROM dataset

Questa query restituisce:

+-------------------------------------+ | hello_msg | some_int | some_map | +-------------------------------------+ | HELLO ATHENA | 12345 | {a:1,b:2} | +-------------------------------------+