Comando SELECT - Amazon Simple Storage Service

Comando SELECT

Amazon S3 Select supporta soltanto il comando SQL SELECT. Le seguenti clausole standard ANSI sono supportate per SELECT:

  • SELECT Elenco

  • FROMClausola

  • WHEREClausola

  • LIMITClausola

Nota

Al momento, le query di Amazon S3 Select non supportano query secondarie o join.

Elenco SELECT

L'elenco SELECT assegna un nome a colonne, funzioni ed espressioni che la query deve restituire. L'elenco rappresenta l'output della query.

SELECT * SELECT projection [ AS column_alias | column_alias ] [, ...]

La prima forma con * (asterisco) restituisce ogni riga che ha passato la clausola WHERE, così com'è. Il secondo formato crea una riga con la proiezione delle espressioni scalari di output definite dall'utente per ogni colonna.

Clausola FROM

Amazon S3 Select supporta i seguenti formati della clausola FROM:

FROM table_name FROM table_name alias FROM table_name AS alias

Dove table_name è uno degli S3Object su cui viene eseguita la query. Gli utenti abituati a database relazionali tradizionali possono considerare questo come uno schema di database che contiene più viste di una tabella.

Nel linguaggio SQL standard, la clausola FROM crea righe che vengono filtrate nella clausola WHERE e proiettate nell'elenco SELECT.

Per tutti gli oggetti JSON archiviati in Amazon S3 Select, puoi anche utilizzare i seguenti moduli della clausola FROM:

FROM S3Object[*].path FROM S3Object[*].path alias FROM S3Object[*].path AS alias

Utilizzando questo modulo della clausola FROM, puoi selezionare da array o oggetti inclusi in un oggetto JSON. Puoi specificare path mediante uno dei seguenti moduli:

  • Per nome (in un oggetto): .name o ['name']

  • Per indice (in un array): [index]

  • Per carattere jolly (in un oggetto): .*

  • Per carattere jolly (in un array): [*]

Nota
  • Questo modulo della clausola FROM è utilizzabile solo con oggetti JSON.

  • I caratteri jolly emettono sempre almeno un record. Se nessun record corrisponde, Amazon S3 Select emette il valore MISSING. Durante la serializzazione dell'output (dopo che la query è stata completata), Amazon S3 Select sostituisce i valori MISSING con record vuoti.

  • Le funzioni di aggregazione (AVG, COUNT, MAX, MIN e SUM) ignorano i valori MISSING.

  • Se non fornisci un alias quando utilizzi un carattere jolly, puoi fare riferimento alla riga utilizzando l'ultimo elemento nel percorso. Ad esempio, puoi selezionare tutti i prezzi da un elenco di libri utilizzando la query SELECT price FROM S3Object[*].books[*].price. Se il percorso termina con un carattere jolly anziché con un nome, puoi utilizzare il valore _1 per fare riferimento alla riga. Ad esempio, anziché SELECT price FROM S3Object[*].books[*].price, puoi usare la query SELECT _1.price FROM S3Object[*].books[*].

  • Amazon S3 Select considera sempre un documento JSON come un array di valori a livello di radice. Pertanto, anche se l'oggetto JSON che stai interrogando ha solo un elemento radice, la clausola FROM deve iniziare con S3Object[*]. Tuttavia, per motivi di compatibilità, Amazon S3 Select consente di omettere il carattere jolly se non si include un percorso. Pertanto, la clausola completa FROM S3Object è equivalente a FROM S3Object[*] as S3Object. Se includi un percorso, devi utilizzare anche il carattere jolly. Pertanto FROM S3Object e FROM S3Object[*].path sono entrambe clausole valide, ma FROM S3Object.path non è valida.

Esempi:

Esempio 1

Questo esempio mostra i risultati utilizzando i seguenti set di dati e query:

{ "Rules": [ {"id": "1"}, {"expr": "y > x"}, {"id": "2", "expr": "z = DEBUG"} ]} { "created": "June 27", "modified": "July 6" }
SELECT id FROM S3Object[*].Rules[*].id
{"id":"1"} {} {"id":"2"} {}

Amazon S3 Select produce ciascun risultato per i seguenti motivi:

  • {"id":"id-1"} - S3Object[0].Rules[0].id ha prodotto una corrispondenza.

  • {}: S3Object[0].Rules[1].id non ha prodotto una corrispondenza con un record, quindi Amazon S3 Select ha emesso un valore MISSING, che è stato quindi modificato in un record vuoto durante la serializzazione dell'output e restituito.

  • {"id":"id-2"} - S3Object[0].Rules[2].id ha prodotto una corrispondenza.

  • {} - S3Object[1] non ha prodotto una corrispondenza in Rules, quindi Amazon S3 Select ha emesso un valore MISSING, che è stato quindi modificato in un record vuoto durante la serializzazione dell'output e restituito.

Se non desideri che Amazon S3 Select restituisca record vuoti quando non trova una corrispondenza, puoi testare il valore MISSING. La seguente query restituisce gli stessi risultati della query precedente, ma con i valori vuoti omessi:

SELECT id FROM S3Object[*].Rules[*].id WHERE id IS NOT MISSING
{"id":"1"} {"id":"2"}

Esempio 2

Questo esempio mostra i risultati utilizzando i seguenti set di dati e query:

{ "created": "936864000", "dir_name": "important_docs", "files": [ { "name": "." }, { "name": ".." }, { "name": ".aws" }, { "name": "downloads" } ], "owner": "AWS S3" } { "created": "936864000", "dir_name": "other_docs", "files": [ { "name": "." }, { "name": ".." }, { "name": "my stuff" }, { "name": "backup" } ], "owner": "User" }
SELECT d.dir_name, d.files FROM S3Object[*] d
{"dir_name":"important_docs","files":[{"name":"."},{"name":".."},{"name":".aws"},{"name":"downloads"}]} {"dir_name":"other_docs","files":[{"name":"."},{"name":".."},{"name":"my stuff"},{"name":"backup"}]}
SELECT _1.dir_name, _1.owner FROM S3Object[*]
{"dir_name":"important_docs","owner":"AWS S3"} {"dir_name":"other_docs","owner":"User"}

Clausola WHERE

La sintassi della clausola WHERE è la seguente:

WHERE condition

La clausola WHERE filtra le righe in base alla condizione. Una condizione è un'espressione che genera un risultato booleano. Solo le righe per le quali la condizione è TRUE sono restituite nel risultato.

Clausola LIMIT

La sintassi della clausola LIMIT è la seguente:

LIMIT number

La clausola LIMIT limita il numero di record che desideri vengano restituiti dalla query in base al numero specificato.

Accesso agli attributi

Le clausole SELECT e WHERE possono fare riferimento a record di dati utilizzando uno dei metodi descritti nelle seguenti sezioni, a seconda che il file su cui viene eseguita la query sia in formato CSV o JSON.

CSV

  • Numeri di colonna: puoi fare riferimento alla N-esima colonna di una riga con il nome di colonna _N, dove N è la posizione della colonna. La numerazione delle posizioni inizia da 1. Ad esempio, la prima colonna è denominata _1 e la seconda è denominata _2.

    Puoi fare riferimento a una colonna con _N o alias._N. Ad esempio, _2 e myAlias._2 sono entrambi modi validi di fare riferimento a una colonna nell'elenco SELECT e nella clausola WHERE.

  • Intestazioni di colonna: per gli oggetti in formato CSV che hanno una riga di intestazione, le intestazioni sono disponibili per l'elenco SELECT e la clausola WHERE. In particolare, come nel linguaggio SQL classico, all'interno di espressioni con le clausole SELECT e WHERE è possibile fare riferimento alle colonne in base a alias.column_name o column_name.

JSON

  • Documento: puoi accedere ai campi di documento JSON con alias.name. È inoltre possibile accedere ai campi nidificati, ad esempi, alias.name1.name2.name3.

  • Elenco: puoi accedere agli elementi in un elenco JSON utilizzando indici a base zero con l'operatore []. Ad esempio, puoi accedere al secondo elemento di un elenco con alias[1]. L'accesso agli elementi di un elenco può essere combinato con i campi con alias.name1.name2[1].name3.

  • Esempi: considera questo oggetto JSON come un set di dati di esempio:

    {"name": "Susan Smith", "org": "engineering", "projects": [ {"project_name":"project1", "completed":false}, {"project_name":"project2", "completed":true} ] }

    Esempio 1

    La seguente query restituisce questi risultati:

    Select s.name from S3Object s
    {"name":"Susan Smith"}

    Esempio 2

    La seguente query restituisce questi risultati:

    Select s.projects[0].project_name from S3Object s
    {"project_name":"project1"}

Distinzione tra maiuscole e minuscole nei nomi di intestazioni/attributi

Con Amazon S3 Select puoi utilizzare le virgolette doppie per indicare che nelle intestazioni di colonna (per gli oggetti CSV) e negli attributi (per gli oggetti JSON) si applica la distinzione tra maiuscole e minuscole. In assenza delle virgolette doppie, le intestazioni e gli attributi degli oggetti non prevedono distinzione tra maiuscole e minuscole. In caso di ambiguità viene generato un errore.

I seguenti esempi sono 1) oggetti Amazon S3 in formato CSV con le intestazioni di colonna specificate e con FileHeaderInfo impostato su "Use" per la richiesta di query oppure 2) oggetti Amazon S3 in formato JSON con gli attributi specificati.

Esempio 1: l'oggetto su cui viene eseguita la query ha intestazione/attributo "NAME".

  • La seguente espressione restituisce correttamente i valori dall'oggetto (senza virgolette: nessuna distinzione tra maiuscole e minuscole):

    SELECT s.name from S3Object s
  • La seguente espressione genera un errore 400 MissingHeaderName (virgolette: distinzione tra maiuscole e minuscole):

    SELECT s."name" from S3Object s

Esempio 2: l'oggetto Amazon S3 su cui viene eseguita la query ha un'intestazione/attributo con "NAME" e un'altra intestazione/attributo con "name".

  • La seguente espressione genera un errore 400 AmbiguousFieldName (senza virgolette: senza distinzione tra maiuscole e minuscole, ma ci sono due corrispondenze):

    SELECT s.name from S3Object s
  • La seguente espressione restituisce correttamente i valori dall'oggetto (virgolette: distinzione tra maiuscole e minuscole, l'ambiguità viene risolta).

    SELECT s."NAME" from S3Object s

Utilizzo di parole chiave riservate come termini definiti dall'utente

Amazon S3 Select dispone di un set di parole chiave riservate, necessarie per eseguire le espressioni SQL utilizzate per le query sul contenuto degli oggetti. Tali parole chiave riservate includono nomi di funzioni, tipi di dati, operatori e così via. In alcuni casi, i termini definiti dall'utente, ad esempio le intestazioni di colonna (per i file CSV) o gli attributi (per gli oggetti JSON) possono essere in conflitto con una parola chiave riservata. Quando ciò si verifica, devi utilizzare le virgolette doppie per indicare che stai intenzionalmente utilizzando un termine definito dall'utente in conflitto con una parola chiave riservata. In caso contrario, verrà generato un errore di analisi 400.

Per l'elenco completo delle parole chiave riservate, consulta Parole chiave riservate.

Il seguente esempio è 1) un oggetto Amazon S3 in formato CSV con le intestazioni di colonna specificate e con FileHeaderInfo impostato su "Use" per la richiesta di query oppure 2) un oggetto Amazon S3 in formato JSON con gli attributi specificati.

Esempio: l'oggetto su cui viene eseguita la query ha un'intestazione/attributo denominato "CAST", che è una parola chiave riservata.

  • La seguente espressione restituisce correttamente i valori dall'oggetto (virgolette: è possibile utilizzare intestazione/attributo definito dall'utente):

    SELECT s."CAST" from S3Object s
  • La seguente espressione restituisce un errore di analisi 400 (senza virgolette: conflitto con la parola chiave riservata):

    SELECT s.CAST from S3Object s

Espressioni scalari

Nella clausola WHERE e nell'elenco SELECT, puoi avere espressioni scalari di SQL, ovvero espressioni che restituiscono valori scalari. Queste espressioni hanno la seguente forma:

  • literal

    Un valore letterale SQL.

  • column_reference

    Un riferimento a una colonna nel formato column_name o alias.column_name.

  • unary_op expression

    Dove unary_op è un operatore SQL unario.

  • expression binary_op expression

    Dove binary_op è un operatore binario SQL.

  • func_name

    Dove func_name è il nome di una funzione scalare da richiamare.

  • expression [ NOT ] BETWEEN expression AND expression

  • expression LIKE expression [ ESCAPE expression ]