Pourquoi est-ce que je n'obtiens aucun enregistrement lorsque j'interroge ma table Amazon Athena avec des partitions définies ?

Dernière mise à jour : 22/03/2021

J'ai exécuté une instruction CREATE TABLE dans Amazon Athena, avec les colonnes attendues et les types de données correspondants. Lorsque j'exécute la requête « SELECT* FROM table-name », le résultat obtenu est « Zero records returned ».

Résolution

Voici quelques motifs courants susceptibles d'expliquer pourquoi la requête peut ne renvoyer aucun enregistrement.

Fichier sélectionné dans les paramètres du robot d'indexation

Si vous utilisez un robot d'indexation, assurez-vous qu'il pointe vers le compartiment Amazon Simple Storage Service (Amazon S3) plutôt que vers un fichier.

Chemin LOCATION incorrect

Vérifiez le chemin LOCATION Amazon S3 applicable aux données d'entrée. Si le chemin d’entrée LOCATION est incorrect, Athena ne renvoie aucun enregistrement.

Double barre oblique dans le chemin LOCATION

Athena ne prend pas en charge les chemins d’emplacement de table qui incluent une double barre oblique (//). Par exemple, le chemin LOCATION suivant renverra des résultats vides :

s3 : //doc-example-bucket/myprefix//input//

Pour résoudre ce problème, copiez les fichiers dans un emplacement dont le chemin ne comporte pas de barres obliques doubles. Pour ce faire, voici un exemple de commande AWS CLI (AWS Command Line Interface) :

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

Remarque : si vous recevez des erreurs lors de l'exécution de commandes AWS CLI, vérifiez que vous utilisez la version la plus récente d'AWS CLI.

Données pour plusieurs tables stockées dans le même préfixe S3

Les analyseurs AWS Glue créent des tables distinctes pour les données stockées dans le même préfixe S3. Cependant, lorsque vous interrogez ces tables dans Athena, vous n'obtenez aucun enregistrement.

Par exemple, votre requête Athena ne renvoie aucun enregistrement si l'emplacement de votre table est semblable à ce qui suit :

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

Afin de résoudre ce problème, créez des préfixes S3 individuels pour chaque table, comme suit :

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

Ensuite, exécutez une requête semblable à la suivante pour mettre à jour l'emplacement de votre table table1 :

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

Les partitions n'ont pas encore été chargées

Athena crée des métadonnées uniquement lorsqu'une table est créée. Les données sont analysées uniquement lorsque la requête est exécutée. Si votre table comporte des partitions définies, il est possible qu'elles n'aient pas encore été chargées dans le Catalogue de données AWS Glue ou dans le catalogue de données Athena interne. Utilisez la commande MSCK REPAIR TABLE ou ALTER TABLE ADD PARTITION pour charger les informations relatives à la partition dans le catalogue.

MSCK REPAIR TABLE

Si les partitions sont stockées dans un format pris en charge par Athena, exécutez la commande MSCK REPAIR TABLE pour charger les métadonnées d'une partition dans le catalogue. Par exemple, si l'une de vos tables est partitionnée sur Year (Année), les données doivent, de ce fait, se trouver dans des emplacements Amazon S3 similaires aux suivants :

  • 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

Si les données se trouvent dans un emplacement Amazon S3 pris en charge par Athena, réparez la table en exécutant une commande similaire à la suivante :

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/';

Une fois la table créée, chargez les informations relatives à la partition :

MSCK REPAIR TABLE Employee;

Une fois les données chargées, exécutez à nouveau la requête SELECT* FROM nom-table.

ALTER TABLE ADD PARTITION

Si les partitions ne sont pas stockées dans un format pris en charge par Amazon Athena, ou se trouvent dans des emplacements Amazon S3 différents, exécutez la commande ALTER TABLE ADD PARTITION pour chaque partition. Supposons que vos données se trouvent aux chemins Amazon S3 suivants :

  • 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

Exécutez alors une commande similaire à celle-ci :

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/'

Une fois les données chargées, exécutez à nouveau la requête SELECT* FROM nom-table.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?