Pourquoi est-ce que je n'obtiens aucun enregistrement lorsque j'interroge ma table Amazon 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. Lorsque j'exécute la requête SELECT * FROM table-name, j'obtiens le résultat : « Aucun enregistrement renvoyé. »

Résolution

Plusieurs raisons courantes peuvent expliquer pourquoi la requête ne renvoie pas d'enregistrements. 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.

Partitions AWS Glue

Fichier sélectionné dans les paramètres du crawler

Si vous utilisez un crawler, vérifiez 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 pour les données d'entrée. Si le chemin LOCATION saisi est incorrect, Athena ne renvoie aucun enregistrement.

Double barre oblique dans le chemin LOCATION

Athena ne prend pas en charge les chemins d'emplacement des tables qui incluent une double barre oblique (//). Par exemple, le chemin LOCATION suivant renvoie des résultats vides : s3://doc-example-bucket/myprefix//input//

Pour résoudre ce problème, copiez les fichiers vers un emplacement dépourvu de double barres obliques. Voici une commande de l'interface de la ligne de commande AWS (AWS CLI) permettant de copier des fichiers :

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

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

Caractères spéciaux

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. Stockage des données de plusieurs tables dans le même préfixe S3 Les crawlers 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 renverra aucun enregistrement si l'emplacement de votre table est similaire aux exemples suivants :

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

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

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

Exécutez ensuite une requête similaire à cet exemple 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 commandeMSCK REPAIR TABLE ou ALTER TABLE ADD PARTITION pour charger les informations relatives à la partition dans le catalogue.

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 vous avez une table partitionnée sur Année, Athena s'attend à trouver les données dans des chemins Amazon S3 similaires aux exemples 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 bien dans les chemins Amazon S3 attendus par Athena, réparez la table en exécutant une commande similaire à cet exemple :

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 suivante :

SELECT * FROM Employee;

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

Supposons, par exemple, que vos données se trouvent dans les 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

Pour ces chemins, exécutez une commande similaire à cet exemple :

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 suivante :

SELECT * FROM Employee;

Fichiers Hive cachés

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

Athena considère en effet ces fichiers comme des espaces réservés et les ignore lors du traitement d'une requête. Pour en savoir plus, veuillez vous reporter à la section Athena ne peut pas lire les fichiers cachés. Si tous les fichiers de votre chemin S3 ont des noms commençant par un trait de soulignement ou un point, vous n'obtiendrez aucun enregistrement.

Remarque : si votre chemin S3 inclut des espaces réservés ainsi que des fichiers dont les noms commencent par des caractères différents, Athena ignorera uniquement les espaces réservés et interrogera les autres fichiers. Dans ce cas, vous obtiendrez probablement un ou plusieurs enregistrements.

Par exemple :

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

Projection de partition

Valeurs situées hors des limites de la plage de projection de partition

Les requêtes portant sur des valeurs situées au-delà des limites de plage définies pour la projection de partition ne renvoient pas de message d'erreur. En revanche, la requête ne renvoie aucune ligne.

Supposons, par exemple, que vos données remontent à 2020 et soient définies comme suit : projection.timestamp.range'='2020/01/01,NOW

Si cet exemple de requête est exécuté, la requête se termine correctement, mais ne renvoie aucune ligne :

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

Le modèle de stockage ne suit pas le schéma de partitionnement par défaut

Si l'emplacement de vos fichiers Amazon S3 ne suit pas le modèle d'emplacement « .../column=value... », vous devez alors 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.

Pour définir un schéma de partitionnement S3 personnalisé, reportez-vous à la section Spécification d'emplacements de stockage S3 personnalisés.

Le modèle de stockage personnalisé est incorrect

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

Supposons, par exemple, que vous définissiez l'année d'une colonne de partition avec l'instruction DDL PARTITIONED BY (chaîne d'année) et que l'emplacement de vos fichiers S3 soit **s3://doc-example-bucket/athena/inputdata/Year=2022/.**Cet emplacement ne renvoie aucun enregistrement. Vous devez modifier l'emplacement de stockage Amazon S3 : s3://doc-example-bucket/athena/inputdata/Year=${year}.

Propriétés de la partition

Si vous avez une partition de type enum, entier ou date pour les colonnes, veillez à définir 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.

Supposons, par exemple, que des données temporelles arrivent chaque jour, une heure après minuit à l'emplacement suivant : s3://doc-example-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 la table de cet exemple ne renvoient aucun enregistrement. En effet, les emplacements de fichiers de la propriété projetés correspondent à minuit : s3://doc-example-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éation de tables dans Athena

Utilisation des Crawlers AWS Glue

Configuration de la projection de partition

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 9 mois