Salta al contenuto

Perché non ottengo quando eseguo query sulla mia tabella Athena?

6 minuti di lettura
0

Ho eseguito un'istruzione CREATE TABLE in Amazon Athena con le colonne previste e i relativi tipi di dati. Tuttavia, quando eseguo la query SELECT * FROM table-name, ricevo l'output "Zero records returned".

Risoluzione

Nota: se ricevi errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Esistono diversi motivi per cui la query SELECT\ * FROM table-name potrebbe non restituire record. In base al caso d'uso, consulta la sezione correlata per i motivi più comuni e le procedure di risoluzione dei problemi.

Risoluzione dei problemi relativi alle partizioni di AWS Glue

Controlla le impostazioni del crawler

Se utilizzi un crawler, verifica che punti verso il bucket Amazon Simple Storage Service (Amazon S3) e non verso un file specifico. Ad esempio, utilizza s3://amzn-s3-demo-bucket/new invece di s3://amzn-s3-demo-bucket/new/data.json.

Utilizza il percorso LOCATION corretto

Verifica che il percorso LOCATION di Amazon S3 per i dati di input sia corretto. Inoltre, assicurati che il percorso del bucket S3 non includa un file né un carattere jolly. Ad esempio, utilizza il percorso LOCATION s3://amzn-s3-demo-bucket/new invece di s3://amzn-s3-demo-bucket/new/data.json.

Utilizza una sola barra nel percorso LOCATION

In Athena, non puoi utilizzare percorsi di posizione delle tabelle che includono una doppia barra (//). Ad esempio, il seguente percorso LOCATION restituisce risultati vuoti: s3://amzn-s3-demo-bucket/myprefix//input//

Per copiare i file in una posizione che non ha doppie barre, esegui questo comando AWS CLI cp:

aws s3 cp s3://amzn-s3-demo-bucket/myprefix//input// s3://amzn-s3-demo-bucket/myprefix/input/ --recursive

Nota: sostituisci amzn-s3-demo-bucket/myprefix//input// con il percorso di posizione della tua tabella corrente e amzn-s3-demo-bucket/myprefix/input/ con il percorso di posizione della tua nuova tabella.

È consigliabile includere solo trattini bassi o lettere maiuscole nei nomi delle colonne della tabella. Ad esempio, puoi denominare una colonna table_name, ma non table-name.

Nota: AWS Glue e Athena non possono leggere la notazione a cammello, le maiuscole o caratteri speciali diversi dal trattino basso.

Crea prefissi Amazon S3 per ogni tabella

I crawler di AWS Glue creano tabelle separate per i dati archiviati nello stesso prefisso Amazon S3. Tuttavia, quando esegui una query su tali tabelle in Athena, non ottieni record. Ad esempio, la query Athena non restituisce record se la posizione della tabella è simile alla seguente:

  • s3://amzn-s3-demo-bucket/table1.csv
  • s3://amzn-s3-demo-bucket/table2.csv

Per risolvere il problema, crea prefissi Amazon S3 individuali per ogni tabella simili ai seguenti esempi:

  • s3://amzn-s3-demo-bucket/table1/table1.csv
  • s3://amzn-s3-demo-bucket/table2/table2.csv

Quindi esegui questa query per aggiornare la posizione della tabella:

ALTER TABLE table1 SET LOCATION 's3://amzn-s3-demo-bucket/table1';

Nota: sostituisci amzn-s3-demo-bucket con il nome del tuo bucket e table1 con il nome della tua tabella.

Carica le partizioni

Athena crea metadati solo quando crei una tabella. I dati vengono analizzati solo quando esegui la query. Se la tabella ha partizioni definite, è possibile che il Catalogo dati AWS Glue o il catalogo dati interno di Athena non abbiano caricato le partizioni.

Se Athena supporta il formato delle partizioni, esegui MSCK REPAIR TABLE per caricare i metadati di una partizione nel catalogo. Ad esempio, hai una tabella partizionata per Anno. In questo caso, Athena prevede di trovare i dati in percorsi Amazon S3 simili ai seguenti esempi:

  • s3://amzn-s3-demo-bucket/athena/inputdata/year=2020/data.csv
  • s3://amzn-s3-demo-bucket/athena/inputdata/year=2019/data.csv
  • s3://amzn-s3-demo-bucket/athena/inputdata/year=2018/data.csv

Se i dati si trovano nei percorsi Amazon S3 previsti da Athena, ripara la tabella con un comando simile al seguente:

CREATE EXTERNAL TABLE Employee (    Id INT,    
    Name STRING,
    Address STRING
) PARTITIONED BY (year INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION 's3://amzn-s3-demo-bucket/athena/inputdata/';

Dopo che Athena ha creato la tabella, esegui questo comando per caricare le informazioni della partizione:

MSCK REPAIR TABLE Employee;

Dopo che Athena ha caricato i dati, esegui nuovamente questa query:

SELECT * FROM Employee;

Se Athena non supporta il formato delle partizioni o le partizioni si trovano in percorsi Amazon S3 diversi, esegui ALTER TABLE ADD PARTITION per ogni partizione.

Ad esempio, supponiamo che i dati si trovino nei seguenti percorsi Amazon S3:

  • s3://amzn-s3-demo-bucket/athena/inputdata/2020/data.csv
  • s3://amzn-s3-demo-bucket/athena/inputdata/2019/data.csv
  • s3://amzn-s3-demo-bucket/athena/inputdata/2018/data.csv

Per i percorsi precedenti, esegui un comando simile al seguente esempio:

ALTER TABLE Employee ADD PARTITION (year=2020) LOCATION 's3://amzn-s3-demo-bucket/athena/inputdata/2020/'
    PARTITION (year=2019) LOCATION 's3://amzn-s3-demo-bucket/athena/inputdata/2019/'
    PARTITION (year=2018) LOCATION 's3://amzn-s3-demo-bucket/athena/inputdata/2018/'

Dopo che Athena ha caricato i dati, esegui nuovamente questa query:

SELECT * FROM Employee;

Controlla i nomi dei file

Verifica che i nomi dei tuoi file non inizino con un trattino basso o con un punto.

Quando elabori una query, Athena considera questi file come segnaposti e li ignora. Se tutti i file nel percorso Amazon S3 hanno nomi che iniziano con un trattino basso o con un punto, non ottieni record.

Ad esempio, se elabori una query con i seguenti file nel percorso Amazon S3, non ottieni record:

  • s3://amzn-s3-demo-bucket/athena/inputdata/_file1
  • s3://amzn-s3-demo-bucket/athena/inputdata/.file2

Nota: se il percorso Amazon S3 include segnaposti e file che iniziano con caratteri diversi, Athena ignora solo i segnaposti ed eseguire la query sugli altri file. Di conseguenza, potresti ottenere uno o più record.

Risolvi i problemi relativi alla proiezione delle partizioni

Verifica che i valori rientrino nei limiti dell'intervallo

Se i valori superano i limiti dell'intervallo definiti per la proiezione delle partizioni, la query non restituisce righe.

Ad esempio, i dati iniziano nel 2020 e li definisci come segue: projection.timestamp.range'='2020/01/01,NOW

Se esegui questa query, la query viene completata correttamente ma non restituisce righe:

SELECT * FROM table-name WHERE timestamp = '2019/02/02'

Verifica lo schema di partizionamento del modello di archiviazione

Se la posizione di archiviazione Amazon S3 non utilizza il modello di posizione .../column=value..., devi specificare uno schema di partizionamento di Amazon S3 personalizzato. Se non definisci uno schema personalizzato, la query non restituisce record.

Utilizza il modello di archiviazione personalizzato corretto

Se utilizzi un modello personalizzato, assicurati che consenta ad Athena di creare le posizioni delle partizioni. Inoltre, assicurati che ogni segnaposto e il percorso Amazon S3 terminino con una singola barra.

Ad esempio, definisci una colonna di partizione anno con l'istruzione Data Definition Language (DDL) PARTITIONED BY (stringa dell’anno) e la posizione di archiviazione è s3://amzn-s3-demo-bucket/athena/inputdata/Year=2022/. Questa posizione non restituisce record. Per risolvere il problema, aggiorna la posizione di archiviazione a s3://amzn-s3-demo-bucket/athena/inputdata/Year=${year}.

Verifica le proprietà della partizione

Se hai colonne di partizione con il tipo di colonna di partizione enum, integer, date o injected, assicurati di configurare correttamente le proprietà della partizione. La configurazione deve consentire ad Athena di creare posizioni di partizione che corrispondano alla struttura dei dati in Amazon S3.

Ad esempio, hai dati correlati al tempo che arrivano ogni giorno 1 ora dopo la mezzanotte nella posizione s3://amzn-s3-demo-bucket/athena/inputdata/2022-01-01-01-00.

In questo esempio, la tabella Athena utilizza le seguenti proprietà della partizione:

'projection.dt.format' = 'yyyy-MM-dd-HH-mm','projection.dt.range' = '2022-01-01-00-00,NOW',
'projection.dt.interval' = '1',
'projection.dt.interval.unit' = 'DAYS'

Le query eseguite sull'esempio di tabella non restituiscono record perché le posizioni dei file della proprietà corrispondono a mezzanotte s3://amzn-s3-demo-bucket/athena/inputdata/2022-01-01-00-00.

Per risolvere il problema, imposta la proprietà projection.dt.range su 2022-01-01-01-00,NOW.

Informazioni correlate

Crea tabelle in Athena

Utilizzare un crawler per aggiungere una tabella

Proiezione delle partizioni configurata

AWS UFFICIALEAggiornata un anno fa