Passer au contenu

Pourquoi est-ce que je n'obtiens aucun enregistrement lorsque j'interroge ma table Athena ?

Lecture de 7 minute(s)
0

J'ai exécuté une instruction CREATE TABLE dans Amazon Athena avec les colonnes attendues et leurs types de données. Mais, lorsque j'exécute la requête SELECT * FROM table-name, la sortie « Aucun enregistrement renvoyé » s’affiche.

Résolution

Remarque : si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre des erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l'AWS CLI.

La requête SELECT * FROM table-name peut ne renvoyer aucun enregistrement pour plusieurs raisons. En fonction de votre cas d'utilisation, veuillez consulter la section correspondante pour connaître les raisons courantes, ainsi que les étapes à suivre pour résoudre ce problème.

Résoudre les problèmes liés aux partitions AWS Glue

Vérifiez les paramètres de votre robot

Si vous utilisez un robot, vérifiez qu'il pointe vers le compartiment Amazon Simple Storage Service (Amazon S3) et non vers un fichier spécifique. Par exemple, utilisez s3://amzn-s3-demo-bucket/new plutôt que s3://amzn-s3-demo-bucket/new/data.json.

Utilisez le chemin EMPLACEMENT approprié

Vérifiez que le chemin EMPLACEMENT Amazon S3 pour les données d'entrée est correct. Vérifiez également que le chemin du compartiment S3 n'inclut pas de fichier ni de caractère générique. Par exemple, utilisez le chemin EMPLACEMENT s3://amzn-s3-demo-bucket/new plutôt que s3://amzn-s3-demo-bucket/new/data.json.

Utilisez une seule barre oblique dans le chemin EMPLACEMENT

Dans Athena, vous ne pouvez pas utiliser les chemins d'emplacement de tables qui incluent une double barre oblique (//). Par exemple, le chemin EMPLACEMENT suivant renvoie des résultats vides : s3://amzn-s3-demo-bucket/myprefix//input//

Pour copier les fichiers vers un emplacement qui ne comporte pas de double barre oblique, exécutez la commande cp de l’AWS CLI suivante :

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

Remarque : remplacez amzn-s3-demo-bucket/myprefix//input// par le chemin d'emplacement de table actuel, et amzn-s3-demo-bucket/myprefix/input/ par le nouveau chemin d'emplacement de table.

Il est recommandé de n'inclure que des traits de soulignement ou des majuscules dans les noms des colonnes de votre table. Par exemple, vous pouvez nommer une colonne table_nom, mais pas table-nom.

Remarque : AWS Glue et Athena ne peuvent pas lire la « casse de chameau », les majuscules ou les caractères spéciaux autres que le trait de soulignement.

Créez des préfixes Amazon S3 pour chaque table

Les robots AWS Glue créent des tables distinctes pour les données qui sont stockées dans le même préfixe Amazon S3. Cependant, lorsque vous interrogez ces tables dans Athena, vous n'obtenez aucun enregistrement. Par exemple, votre requête Athena ne renverra aucun enregistrement si l'emplacement de votre table est similaire aux exemples suivants :

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

Pour résoudre ce problème, créez des préfixes Amazon S3 individuels pour chaque table, comme dans les exemples suivants :

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

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

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

Remarque : remplacez amzn-s3-demo-bucket par le nom de votre compartiment et table1 par le nom de votre table.

Chargez vos partitions

Athena crée des métadonnées uniquement lorsque vous créez une table. Les données ne sont analysées que lorsque vous exécutez la requête. Si votre table comporte des partitions définies, il est possible que le catalogue de données AWS Glue ou le catalogue de données Athena interne n’ait pas chargé les partitions.

Si Athena prend en charge le format de vos partitions, exécutez MSCK REPAIR TABLE pour charger les métadonnées d'une partition dans le catalogue. Par exemple, vous disposez d’une table qui est partitionnée sur Année. Dans ce cas, Athena s'attend à trouver les données dans les chemins Amazon S3 comme dans les exemples suivants :

  • 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

Si vos données se trouvent dans les chemins Amazon S3 attendus par Athena, réparez la table à l'aide d'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://amzn-s3-demo-bucket/athena/inputdata/';

Une fois qu'Athena a créé la table, exécutez la commande suivante pour charger les informations de partition :

MSCK REPAIR TABLE Employee;

Une fois qu'Athena a chargé les données, exécutez à nouveau la requête suivante :

SELECT * FROM Employee;

Si Athena ne prend pas en charge le format de vos partitions, ou si les partitions se trouvent dans des chemins Amazon S3 différents, exécutez ALTER TABLE ADD PARTITION pour chaque partition.

Par exemple, vos données se trouvent dans les chemins Amazon S3 suivants :

  • 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

Pour les chemins précédents, exécutez une commande similaire à l'exemple suivant :

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

Une fois qu'Athena a chargé les données, exécutez à nouveau la requête suivante :

SELECT * FROM Employee;

Vérifiez vos noms de fichiers

Vérifiez que vos noms de fichiers ne commencent pas par un trait de soulignement ou un point.

Lorsque vous traitez une requête, Athena considère ces fichiers comme des espaces réservés et les ignore. Si tous les fichiers de votre chemin Amazon S3 ont des noms commençant par un trait de soulignement ou un point, vous n'obtiendrez aucun enregistrement.

Par exemple, si vous traitez une requête avec les fichiers suivants dans votre chemin Amazon S3, vous n'obtiendrez aucun enregistrement :

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

Remarque : si votre chemin Amazon S3 inclut des espaces réservés ainsi que des fichiers comportant des caractères différents, Athena ignore uniquement les espaces réservés et interroge les autres fichiers. Par conséquent, vous pouvez obtenir un ou plusieurs enregistrements.

Résoudre les problèmes de projection de partition

Vérifiez que vos valeurs se situent dans les limites de la plage

Si vos valeurs dépassent les limites de la plage définie pour la projection de partition, votre requête ne renvoie aucune ligne.

Par exemple, vos données commencent en 2020 et vous les définissez comme suit : projection.timestamp.range'='2020/01/01,NOW

Si vous exécutez la requête suivante, elle se termine correctement, mais ne renvoie aucune ligne :

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

Vérifiez le schéma de partitionnement de votre modèle de stockage

Si votre emplacement de stockage Amazon S3 n'utilise pas le modèle d’emplacement .../column=value..., vous devez spécifier un schéma de partitionnement Amazon S3 personnalisé. Si vous ne définissez pas de schéma personnalisé, votre requête ne renverra aucun enregistrement.

Utilisez le modèle de stockage personnalisé approprié

Si vous utilisez un modèle personnalisé, assurez-vous qu'il autorise bien Athena à créer vos emplacements de partition. Assurez-vous également que chaque espace réservé et le chemin Amazon S3 se terminent par une seule barre oblique.

Par exemple, vous définissez une colonne de partition année à l'aide de l'instruction DDL (Data Definition Language) PARTITIONED BY (chaîne année) et votre emplacement de stockage est s3://amzn-s3-demo-bucket/athena/inputdata/Year=2022/. Cet emplacement ne renvoie aucun enregistrement. Pour résoudre ce problème, mettez à jour l'emplacement de stockage sur s3://amzn-s3-demo-bucket/athena/inputdata/Year=${year}.

Vérifiez les propriétés de votre partition

Si vous avez des colonnes de partition de type énumération, entier, date ou partition injectée, assurez-vous de configurer correctement les propriétés de la partition. Les configurations doivent permettre à Athena de créer des emplacements de partition qui correspondent à la structure de vos données sur Amazon S3.

Par exemple, vous disposez de données relatives à l'heure qui arrivent tous les jours 1 heure après minuit à l'emplacement s3://amzn-s3-demo-bucket/athena/inputdata/2022-01-01-01-00.

Dans cet exemple, la table Athena utilise les propriétés de partition suivantes :

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

Les requêtes exécutées sur l'exemple de table ne renvoient aucun enregistrement car les emplacements des fichiers de la propriété correspondent à minuit s3://amzn-s3-demo-bucket/athena/inputdata/2022-01-01-00-00.

Pour résoudre ce problème, attribuez à la propriété projection.dt.range la valeur 2022-01-01-01-00,NOW.

Informations connexes

Créer des tables dans Athena

Utiliser un robot pour ajouter une table

Configurer une projection de partition

AWS OFFICIELA mis à jour il y a 9 mois