Perché non ottengo alcun record quando eseguo una query della mia tabella Amazon 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. Quando eseguo la query SELECT * FROM table-name, l'output è "Zero record restituiti."

Risoluzione

Di seguito sono riportati alcuni motivi comuni per cui la query potrebbe restituire zero record. In base al tuo caso d'uso, consulta la sezione correlata per i motivi più comuni e le procedure di risoluzione dei problemi.

Partizioni AWS Glue

File selezionato nelle impostazioni del crawler

Se utilizzi un crawler, verifica che il crawler punti al bucket Amazon Simple Storage Service (Amazon S3) anziché a un file.

Percorso LOCATION non corretto

Verifica il percorso LOCATION di Amazon S3 per i dati di input. Se il percorso LOCATION di input non è corretto, Athena restituisce zero record.

Doppia barra nel percorso LOCATION

Athena non supporta i percorsi di posizione delle tabelle che includono una doppia barra (//). Ad esempio, il seguente percorso LOCATION restituisce risultati vuoti: s3://doc-example-bucket/myprefix//input//

Per risolvere questo problema, copia i file in una posizione priva di doppie barre. Di seguito è riportato un comando dell’interfaccia della linea di comando (AWS CLI) per copiare i file:

aws s3 cp s3://doc-example-bucket/myprefix//input// s3://doc-example-bucket/myprefix/input/ --recursive

Nota: se vengono visualizzati errori durante l'esecuzione dei comandi dell'interfaccia della linea di comando AWS, assicurati di utilizzare la versione più recente di AWS CLI.

**Caratteri speciali **

È consigliabile includere solo caratteri di sottolineatura o lettere maiuscole nei nomi delle colonne della tabella. Ad esempio, puoi denominare una colonna table_name, ma non table-name. Dati per più tabelle archiviate nello stesso prefisso S3 i crawler AWS Glue creano tabelle separate per i dati archiviati nello stesso prefisso S3. Tuttavia, quando si interroga su tali tabelle in Athena, non si ottengono record. Ad esempio, la query Athena restituisce zero record se la posizione della tabella è simile alla seguente:

  • s3://doc-example-bucket/table1.csv
  • s3://doc-example-bucket/table2.csv

Per risolvere questo problema, crea prefissi S3 singoli per ogni tabella simili ai seguenti:

  • s3://doc-example-bucket/table1/table1.csv
  • s3://doc-example-bucket/table2/table2.csv

Quindi, esegui una query simile alla seguente per aggiornare la posizione della tua tabella table1:

ALTER TABLE table1 SET LOCATION 's3://doc-example-bucket/table1';

Partizioni non ancora caricate

Athena crea metadati solo quando viene creata una tabella. I dati vengono analizzati solo quando si esegue la query. Se la tabella ha delle partizioni definite, è possibile che le partizioni non siano ancora state caricate nel Catalogo dati AWS Glue o nel catalogo dati interno di Athena. Utilizzare MSCK REPAIR TABLE o ALTER TABLE ADD PARTITION per caricare le informazioni sulla partizione nel catalogo.

Se le partizioni sono archiviate in un formato supportato da Athena, esegui MSCK REPAIR TABLE per caricare i metadati di una partizione nel catalogo. Ad esempio, se disponi di una tabella partizionata in base all’anno, Athena si aspetta di trovare i dati nei percorsi di Amazon S3 simili ai seguenti:

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

Se i dati si trovano nei percorsi di Amazon S3 previsti da Athena, esegui un comando simile a questo esempio per riparare la tabella:

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

Dopo aver creato la tabella, carica le informazioni sulla partizione:

MSCK REPAIR TABLE Employee;

Dopo il caricamento dei dati, esegui nuovamente la seguente query:

SELECT * FROM Employee;

Se le partizioni non sono archiviate in un formato supportato da Athena o si trovano in percorsi Amazon S3 diversi, esegui ALTER TABLE ADD PARTITION per ciascuna partizione.

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

  • s3://doc-example-bucket/athena/inputdata/2020/data.csv
  • s3://doc-example-bucket/athena/inputdata/2019/data.csv
  • s3://doc-example-bucket/athena/inputdata/2018/data.csv

Con questi percorsi, esegui un comando simile a questo esempio:

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

Dopo il caricamento dei dati, esegui nuovamente la seguente query:

SELECT * FROM Employee;

File nascosti di Hive

Verifica che i nomi dei file non inizino con un carattere di sottolineatura (_) o un punto (.).

Athena considera questi file come segnaposto e li ignora quando elabora una query. Per ulteriori informazioni, consulta Athena non può leggere i file nascosti. Se tutti i file nel tuo percorso S3 hanno nomi che iniziano con un carattere di sottolineatura o un punto, ottieni zero record.

Nota: se il percorso S3 include segnaposti insieme a file i cui nomi iniziano con caratteri diversi, Athena ignora solo i segnaposti e interroga gli altri file. Pertanto, potresti ottenere uno o più record.

Ad esempio:

  • s3://doc-example-bucket/athena/inputdata/_file1
  • s3://doc-example-bucket/athena/inputdata/.file2

Proiezione delle partizioni

Valori che non rientrano nei limiti dell'intervallo per la proiezione delle partizioni

Le interrogazioni per valori che superano i limiti dell'intervallo definiti per la proiezione delle partizioni non restituiscono un errore. La query restituisce invece zero righe.

Ad esempio, supponiamo che i tuoi dati inizino nel 2020 e siano definiti come: projection.timestamp.range'='2020/01/01, NOW

Se si esegue questa query di esempio, la query viene completata correttamente, ma restituisce zero righe:

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

Il modello di archiviazione non segue lo schema di partizionamento predefinito

Se le posizioni dei file Amazon S3 non seguono lo schema di posizione “... /column =valore... “, è necessario specificare uno schema di partizionamento Amazon S3 personalizzato. Se non si definisce uno schema personalizzato, la query restituisce zero record.

Per definire uno schema di partizionamento S3 personalizzato, vedere Indicazione di posizioni di archiviazione S3 personalizzate.

**Modello di archiviazione personalizzato errato **

Se utilizzi un modello personalizzato, assicurati che il modello 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, supponiamo di definire l'anno di una colonna di partizione con l'istruzione DDL PARTITIONED BY (stringa dell'anno) e che le posizioni dei file S3 siano **s3://doc-example-bucket/athena/inputdata/Year=2022/.**Questa posizione restituisce zero record. Aggiorna la posizione di storage di Amazon S3 in: s3://doc-example-bucket/athena/inputdata/Year=${year}.

Proprietà delle partizioni

Se disponi di un tipo enum, integer o data delle colonne di partizione, assicurati di impostare correttamente le proprietà della partizione. Le configurazioni devono consentire ad Athena di creare posizioni di partizione che corrispondano alla struttura dei dati su Amazon S3.

Ad esempio, supponiamo di avere dati relativi all'ora che arrivano ogni giorno un'ora dopo mezzanotte nella posizione: s3://doc-example-bucket/athena/inputdata/2022-01-01-01-00.

In questo esempio, la tabella Athena utilizza le seguenti proprietà di 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 interrogazioni eseguite sulla tabella di esempio restituiscono zero record. Questo perché le posizioni dei file della proprietà proiettate corrispondono alla mezzanotte s3://doc-example-bucket/athena/inputdata/2022-01-01-00-00.

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

Informazioni correlate

Creare tabelle in Athena

Utilizzo dei crawler AWS Glue

Configurare la proiezione delle partizioni

AWS UFFICIALE
AWS UFFICIALEAggiornata 8 mesi fa