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
FROMnell'istruzioneSELECTdefinisce 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.