Passer au contenu

Comment résoudre les problèmes de projection de partition dans Amazon Athena ?

Lecture de 7 minute(s)
0

Je souhaite résoudre les problèmes de projection de partition dans Amazon Athena.

Brève description

Les problèmes de projection de partition peuvent être liés à la correspondance entre la propriété storage.location.template et la structure de répertoire Amazon Simple Storage Service (Amazon S3). Si la colonne est définie comme une colonne de partition, elle requiert un emplacement dans la propriété storage.location.template et une configuration de projection pour la colonne. Lorsque vous créez une propriété storage.location.template, les valeurs de partition sont projetées dans le modèle afin d'extraire les chemins Amazon S3 pour les données. Si le modèle ne correspond pas à votre répertoire ou si vos configurations de projection sont manquantes, des problèmes apparaissent.

Remédiez aux problèmes liés à la projection de partition dans Athena en vous basant sur les scénarios suivants :

  • Votre table Athena a configuré une projection de partition, mais lorsque vous interrogez la table, aucun résultat ne s'affiche.
  • Votre table Athena a configuré une projection de partition, mais vos requêtes échouent avec l'erreur INVALID_TABLE_PROPERTY : La propriété de table 'storage.location.template' doit contenir des modèles pour toutes les colonnes de partition !
  • Votre table Athena a configuré une projection de partition, mais vos requêtes échouent avec l'erreur INVALID_TABLE_PROPERTY : La table (table-name) est configurée pour la projection de partition, mais une configuration de projection est manquante dans les colonnes de partition suivantes : (partition-column-name)
  • Votre table Athena utilise un partitionnement de type Hive, mais vous souhaitez utiliser la projection de partition pour interroger votre table au lieu de charger les partitions.

Résolution

Votre table Athena a configuré une projection de partition, mais aucun résultat ne s'affiche lorsque vous interrogez la table

Pour résoudre ce scénario, prenez les mesures suivantes :

Configurez la projection de partition et vérifiez les paramètres de votre table. Assurez-vous que projection.enabled est vrai. Pour chaque colonne de partition de la table, définissez la propriété projection.columnName.type sur énumération, entier, date ou injecté :

  • Si le type de projection est date, définissez le type de colonne sur Chaîne. Utilisez Chaîne comme type de date pour les clés de partition. Pour plus d'informations, consultez la section Types de données dans Amazon Athena.
  • Si le type de projection est date, utilisez projection.columnName.range et projection.columnName.format. Votre propriété projection.columnName.format doit correspondre à la manière dont les données sont configurées sur le chemin Amazon S3. Utilisez également projection.columnName.interval et projection.columnName.range selon les besoins. Pour plus d'informations, consultez la section Type de date.
  • Si le type de projection est énumération, définissez projection.columnName.values sur une liste de toutes les valeurs potentielles pour cette colonne de partition.
  • Si le type de projection est entier, définissez projection.columnName.range sur une plage de valeurs potentielles pour cette colonne. Utilisez également projection.columnName.interval et projection.columnName.digits selon les besoins. Pour plus d'informations, consultez la section Type d'entier.
  • Pour les colonnes de type injecté, assurez-vous que vos requêtes comportent une expression de filtre telle que WHERE <injected_col> pour chaque colonne. Utilisez également le type de colonne Chaîne dans la définition de colonne de partition pour les colonnes injectées.

Vérifiez que votre propriété storage.location.template comporte un espace réservé pour chaque colonne de partition et qu'elle correspond à la structure de répertoires Amazon S3 de votre compartiment. Par exemple, les journaux AWS CloudTrail peuvent utiliser la projection de partition.

Remarque : Par défaut, votre région AWS et votre ID de compte ne sont pas projetés. Pour plus d'informations, consultez la section Création de la table pour les journaux CloudTrail dans Athena à l'aide de la projection de partition.

Pour projeter la région et l'ID de compte avec les journaux CloudTrail, utilisez le modèle suivant. Utilisez le type énumération et assurez-vous d'énumérer toutes vos régions et votre ID de compte.

Remarque : Remplacez example-bucket par le compartiment Amazon S3 requis. Les champs région, horodatage et compte sont projetés :

'storage.location.template'='s3://<example-bucket>/AWSLogs/${account}/CloudTrail/${region}/${timestamp}'

Pour interroger votre table Athena afin de localiser les données dans un chemin Amazon S3 spécifique, exécutez les commandes suivantes :

Remarque : Remplacez example-YYYY/MM/DD par l'horodatage de votre choix, example-account-ID par l'ID de compte requis et example-region par la région souhaitée.

SELECT * FROM cloudtrail_logs_pp WHERE timestamp='YYYY/MM/DD' AND account=example-account-ID AND region=example-region

Exemple de partition :

s3://bucket/AWSLogs/example-account-ID/CloudTrail/example-region/YYYY/MM/DD

Votre table Athena a configuré une projection de partition, mais vos requêtes échouent avec l'erreur INVALID_TABLE_PROPERTY : La propriété de table 'storage.location.template' doit contenir des modèles pour toutes les colonnes de partition !

Si cette erreur s'affiche, un espace réservé pour la colonne de partition est manquant dans la propriété storage.location.template. Pour résoudre ce problème, assurez-vous que chaque colonne de la clause PARTITIONED BY comporte un espace réservé.

Votre table Athena a configuré une projection de partition, mais vos requêtes échouent avec l'erreur INVALID_TABLE_PROPERTY : La table (table-name) est configurée pour la projection de partition, mais une configuration de projection est manquante dans les colonnes de partition suivantes : (partition-column-name)

Si vous recevez cette erreur, cela signifie que les paramètres de projection de table requis sont manquants dans la colonne définie par la clause PARTITIONED BY, tels que projection.columnName.format. Pour résoudre ce problème, vérifiez les paramètres de votre table comme suit :

  • Si le type de projection est date, utilisez projection.columnName.range et projection.columnName.format. Votre propriété projection.columnName.format doit correspondre à la manière dont les données sont configurées sur le chemin Amazon S3. Utilisez également projection.columnName.interval et projection.columnName.range selon les besoins. Pour plus d'informations, consultez la section Type de date.
  • Si le type de projection est énumération, définissez projection.columnName.values sur une liste de toutes les valeurs potentielles pour cette colonne de partition.
  • Si le type de projection est entier, définissez projection.columnName.range sur une plage de valeurs potentielles pour cette colonne. Utilisez également projection.columnName.interval et projection.columnName.digits selon les besoins. Pour plus d'informations, consultez la section Type d'entier.
  • Pour les colonnes de type injecté, assurez-vous que vos requêtes comportent une expression de filtre pour chaque colonne injectée. Utilisez également le type de colonne Chaîne dans la clause PARTITIONED BY pour les colonnes injectées.

Votre table Athena utilise un partitionnement de type Hive, mais vous souhaitez utiliser la projection de partition pour interroger votre table au lieu de charger les partitions.

Si votre table Athena utilise un partitionnement de type Hive, mais que vous souhaitez utiliser la projection de partition, vérifiez le modèle de stockage et les formats de projection. Le modèle de stockage et les formats de projection doivent inclure la partie partition_col_name= du chemin Amazon S3. Exécutez la commande suivante :

Remarque : Remplacez example-table-name par le nom de table souhaitée.

CREATE EXTERNAL TABLE <example-table-name> (
col1 int,
col2 int
)
PARTITIONED BY
partition_col_name STRING
)
ROW FORMAT DELIMITED
LOCATION
's3://bucket/prefix/'
TBLPROPERTIES (
  'projection.enabled'='true',
  'projection.partition_col_name.type'='<enum,date,etc>',
  ... ##Omitting type-based projection parameters
  'storage.location.template'='s3://bucket/prefix/partition_col_name={partition_col_name}/')

Si vous possédez plusieurs partitions de type Hive et que vous souhaitez les mapper à une seule colonne de partition projetée, modifiez le format de colonne. Pour demander à vos données Amazon S3 d’avoir une colonne de partition unique appelée date, exécutez la commande suivante :

Remarque : Remplacez example-table-name par le nom de table souhaitée.

CREATE EXTERNAL TABLE <example-table-name> (col1 int, col2 int)
PARTITIONED BY (
`date` STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
LOCATION "s3://bucket/prefix/"
TBLPROPERTIES (
  'projection.enabled'='true',
  'projection.date.type'='date',
  'projection.date.format'='\'year=\'yyyy/\'month=\'MM/\'day=\'dd',
  'projection.date.range'='year=2023/month=01/day=01,year=2023/month=12/day=31',
  'storage.location.template' = 's3://bucket/prefix/${date}/')

Exemple de chemin Amazon S3 :

s3://bucket/prefix/year=/month=/day=/
AWS OFFICIELA mis à jour il y a 2 ans