Analisi JSON S3

I valori in un documento JSON possono essere nidificati all'interno di oggetti o array senza limitazioni. Quando si esegue una query di uno specifico valore in un documento JSON nel motore di selezione S3 , l'ubicazione del valore viene specificata tramite un percorso nell'istruzione SELECT .

La struttura generica di un documento JSON non ha una struttura di righe e colonne come CSV e Parquet. Invece, è l'istruzione SQL stessa a definire le righe e colonne quando si esegue la query di un documento JSON.

Il S3 seleziona le analisi del parser JSON del motore S3-objects come segue:
  • La clausola FROM nell'istruzione SELECT definisce i limiti della riga
  • Una riga in un documento JSON è simile al modo in cui il delimitatore di riga viene utilizzato per definire le righe per gli oggetti CSV e al modo in cui i gruppi di righe vengono utilizzati per definire le righe per gli oggetti Parquet
  • Considerare il seguente esempio:
    {
    "firstName": "Joe",
    "lastName": "Jackson",
    "genere": "maschio",
    "età": "venti",
    "indirizzo":
      {
       "streetAddress": "101",
       "città": "San Diego",
       "Stato": "CA"
      },
    "firstName": "Joe_2",
    "lastName": "Jackson_2",
    "genere": "maschio",
    "età": 21,
    "indirizzo": 
     {
      "streetAddress": "101",
      "città": "San Diego",
      "Stato": "CA"
     },
    "phoneNumbers": 
     [
      { "type": "home1", "number": "734928_1","addr": 11 },
      { "type": "home2", "number": "734928_2","addr": 22 }
     ],
    "key_after_array": "XXX",
    "descrizione" : 
     {
      "main_desc" : " value_1 ",
      "second_desc" : " value_2 "
     }
    }
    
     # la clausola from definisce una singola riga.
     # _1 punta al livello dell'oggetto principale.
     # _1.age appare due volte in Documnet-row, l'ultimo valore viene utilizzato per l'operazione.
     query = "select _1.firstname,_1.key_after_array,_1.age+4,_1.description.main_desc,_1. description.second_desc from s3object[* ];";
     risultato_previsto = Joe_2,XXX,25,value_1,value_2
    
    
     # la clausola from punta l'array dei fonogrammi (definisce il parametro _1)
     # ogni elemento dell'array phoneNumbers definisce una riga.
     # in questo caso, ogni elemento è un oggetto che contiene 3 chiavi/valori.
     # la query "non può accedere" ai valori al di fuori dell'array dei numeri di telefono, la query può accedere solo ai valori presenti nel percorso _1.phonenumbers.
     query = "select cast(substring( _1.number,1,6 ) as int) *10 da s3object[* ].phonenumbers dove _1.type= ' home2 ';";
     risultato_previsto = 7349280
    • L'istruzione indica al lettore di ricercare il percorso aa.bb.cc e definisce i limiti di riga basati sulla ricorrenza di questo percorso.
    • Una riga inizia quando il lettore incontra il percorso e termina quando esce dalla parte più interna del percorso, che in questo caso è l'oggetto cc.