Création d'index de partition - AWS Glue

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Création d'index de partition

Au fil du temps, des centaines de milliers de partitions sont ajoutées à une table. Le GetPartitions APIest utilisé pour récupérer les partitions de la table. Les partitions API renvoyées correspondent à l'expression fournie dans la demande.

Prenons l'exemple d'une table sales_data partitionnée par les clés Country, Category, Year, Month et. creationDate Si vous souhaitez obtenir des données de vente pour tous les articles vendus dans la catégorie Livres en 2020 après le 15/08/2020, vous devez faire une GetPartitions demande avec l'expression « Catégorie = « Livres » et creationDate > « 2020-08-15 » » dans le catalogue de données.

Si aucun index de partition n'est présent sur la table, AWS Glue charge toutes les partitions de la table, puis filtre les partitions chargées à l'aide de l'expression de requête fournie par l'utilisateur dans la demande GetPartitions. L'exécution de la requête prend plus de temps à mesure que le nombre de partitions augmente sur une table sans index. Avec un index, la requête GetPartitions essaiera de récupérer un sous-ensemble des partitions au lieu de charger toutes les partitions de la table.

À propos des index de partition

Lorsque vous créez un index de partition, vous spécifiez une liste de clés de partition qui existent déjà sur une table donnée. L'index de partition est une sous-liste des clés de partition définies dans la table. Un index de partition peut être créé sur n'importe quelle permutation de clés de partition définie sur la table. Pour la table sales_data ci-dessus, les index possibles sont (pays, catégorie), (pays, catégorie, annéecreationDate), (pays, catégorie), (pays), (catégorie), (pays), (catégorie, pays, année, mois), etc.

Data Catalog concaténera les valeurs de partition dans l'ordre fourni au moment de la création de l'index. L'index est créé de manière cohérente à mesure que des partitions sont ajoutées à la table. Des index peuvent être créés pour les types de colonnes String (string, char et varchar), Numeric (int, bigint, long, tinyint et smallint) et Date (yyyy-mm-dd).

Types de données pris en charge

  • Date — Une date au ISO format, tel queYYYY-MM-DD. Par exemple, date2020-08-15. Le format utilise des tirets (‐) pour séparer l'année, le mois et le jour. La plage de dates autorisée pour l'indexation s'étend de à0000-01-01. 9999-12-31

  • String — Chaîne littérale entre guillemets simples ou doubles.

  • Char — Données de caractères de longueur fixe, avec une longueur spécifiée comprise entre 1 et 255, telles que char (10).

  • Varchar — Données de caractères de longueur variable, avec une longueur spécifiée comprise entre 1 et 65535, telles que varchar (10).

  • Numérique — int, bigint, long, tinyint et smallint

Les index des types de données Numeric, String et Date prennent en charge les opérateurs =, >, >=, <, <= et entre les opérateurs. La solution d'indexation ne prend actuellement en charge que l'opérateur logique AND. Les sous-expressions comportant les opérateurs LIKE « », « IN », « OR » et « NOT » sont ignorées dans l'expression pour le filtrage à l'aide d'un index. Le filtrage de la sous-expression ignorée est effectué sur les partitions récupérées après application du filtrage d'index.

Pour chaque partition ajoutée à une table, un élément d'index correspondant est créé. Pour une table avec 'n' partitions, 1 index de partition entraînera 'n' éléments d'index de partition. L'index de partition 'm' sur la même table se traduira par des éléments d'index de partition 'm*n'. Chaque élément d'index de partition sera facturé selon la politique de tarification AWS Glue en vigueur pour le stockage du catalogue de données. Pour plus de détails sur la tarification des objets de stockage, consultez la tarification AWS Glue.

Création d'un tableau avec index de partition

Vous pouvez créer un index de partition lors de la création d'une table. La demande CreateTable prend une liste d’objets PartitionIndex comme entrée. 3 index de partition au maximum peuvent être créés sur une table donnée. Chaque index de partition nécessite un nom et une liste de partitionKeys définie pour la table. Les index créés sur une table peuvent être récupérés à l'aide du GetPartitionIndexesAPI

Ajout d'un index de partition à une table existante

Pour ajouter un index de partition à une table existante, utilisez l’opération CreatePartitionIndex. Vous pouvez créer un PartitionIndex par opération CreatePartitionIndex. L'ajout d'un index n'affecte pas la disponibilité d'une table, car la table reste disponible pendant la création des index.

L'état d'index d'une partition ajoutée est défini sur CREATING et la création des données d'index est lancée. Si le processus de création des index aboutit, le indexStatus est mis à jour ACTIVE et en cas d'échec, le statut de l'index est mis à jour versFAILED. La création d'index peut échouer pour plusieurs raisons et vous pouvez utiliser l'opération GetPartitionIndexes pour récupérer les détails de l'échec. Les échecs possibles sont :

  • ENCRYPTED_ PARTITION _ ERROR — La création d'index sur une table contenant des partitions chiffrées n'est pas prise en charge.

  • INVALID_ PARTITION _ TYPE _ DATA _ ERROR — Observé lorsque la partitionKey valeur n'est pas une valeur valide pour le type de partitionKey données correspondant. Par exemple : un partitionKey avec le type de données 'int' a une valeur 'foo'.

  • MISSING_ PARTITION _ VALUE _ ERROR — Observé lorsque le partitionValue foran n'indexedKeyest pas présent. Cela peut se produire lorsqu'une table n'est pas partitionnée de manière cohérente.

  • UNSUPPORTED_ PARTITION _ CHARACTER _ ERROR — Observé lorsque la valeur d'une clé de partition indexée contient les caractères \ u0000, \ u0001 ou \ u0002

  • INTERNAL_ ERROR — Une erreur interne s'est produite lors de la création des index.

Description des indexes de partition sur une table

Pour extraire les index de partition créés sur une table, utilisez l’opération GetPartitionIndexes. La réponse renvoie tous les index de la table, ainsi que le statut actuel de chaque index (IndexStatus).

Le IndexStatus pour un index de partition sera l'un des suivants :

  • CREATING – l'index est en cours de création et n'est pas encore disponible pour utilisation.

  • ACTIVE – l'index est prêt à l'emploi. Les requêtes peuvent utiliser l'index pour effectuer une requête optimisée.

  • DELETING – l'index est actuellement en cours de suppression et ne peut plus être utilisé. Un index à l'état actif peut être supprimé à l'aide de la DeletePartitionIndex demande, ce qui fait passer le statut de ACTIVE àDELETING.

  • FAILED – échec de la création d'index sur une table existante. Chaque table stocke les 10 derniers index ayant échoué.

Les transitions d'état possibles pour les index créés sur une table existante sont :

  • CREATING → ACTIVE → DELETING

  • CREATING → FAILED

Limitations de l'utilisation des index de partition

Une fois que vous avez créé un index de partition, notez ces modifications apportées aux fonctionnalités de table et de partition :

Création d'une nouvelle partition (après ajout d'index)

Une fois qu'un index de partition est créé sur une table, toutes les nouvelles partitions ajoutées à la table seront validées pour les vérifications de type de données pour les clés indexées. La valeur de partition des clés indexées sera validée pour le format de type de données. Si la vérification du type de données échoue, l'opération de création de partition échouera. Pour la table sales_data, si un index est créé pour les clés (catégorie, année) dont la catégorie est de type string et d'année de typeint, la création de la nouvelle partition avec la valeur « foo » échouera. YEAR

Une fois les index activés, l'ajout de partitions avec des valeurs de clé indexées ayant les caractères U+0000, U+00001 et U+0002 commencera à échouer.

mises à jour du tableau

Une fois qu'un index de partition est créé sur une table, vous ne pouvez pas modifier les noms de clé de partition pour les clés de partition existantes, et vous ne pouvez pas changer le type ou l'ordre des clés qui sont enregistrées avec l'index.

Utilisation d'index pour un appel optimisé GetPartitions

Lorsque vous appelez GetPartitions une table avec un index, vous pouvez inclure une expression et, le cas échéant, Data Catalog utilisera un index si possible. La première clé de l'index doit être passée dans l'expression pour les index à utiliser dans le filtrage. L'optimisation de l'index dans le filtrage est appliquée au mieux. Data Catalog essaie d'utiliser l'optimisation d'index autant que possible, mais en cas d'index manquant ou d'opérateur non pris en charge, il revient à l'implémentation existante de chargement de toutes les partitions.

Pour la table sales_data ci-dessus, ajoutons l'index [Country, Category, Year]. Si « Country » (Pays) n'est pas passé dans l'expression, l'index enregistré ne pourra pas filtrer les partitions à l'aide d'index. Vous pouvez ajouter jusqu'à 3 index pour prendre en charge divers modèles de requête.

Prenons quelques exemples d'expressions et voyons comment les index fonctionnent dessus :

Expressions Comment l'index sera-t-il utilisé

Country = 'US'

Index sera utilisé pour filtrer les partitions.

Country = 'US' and Category = 'Shoes'

Index sera utilisé pour filtrer les partitions.

Category = 'Shoes'

Les index ne seront pas utilisés car la valeur « country » (pays) n'est pas fourni dans l'expression. Toutes les partitions seront chargées pour renvoyer une réponse.

Country = 'US' and Category = 'Shoes' and Year > '2018'

Index sera utilisé pour filtrer les partitions.

Country = 'US' and Category = 'Shoes' and Year > '2018' and month = 2

L'index sera utilisé pour récupérer toutes les partitions avec pays = "US" and category = "shoes" and year > 2018. Ensuite, le filtrage sur l'expression du mois sera effectué.

Pays = « États-Unis » AND Catégorie = « Chaussures » OU Année > « 2018 »

Les index ne seront pas utilisés, car un opérateur OR est présent dans l'expression.

Pays = « États-Unis » AND Catégorie = « Chaussures » AND (Année = 2017 OU Année = « 2018 »)

Index sera utilisé pour récupérer toutes les partitions avec country = "US" and category = "shoes", puis un filtrage sur l'expression de l'année sera effectué.

Pays en (« États-Unis », « Royaume-Uni ») AND Catégorie = « Chaussures »

Les index ne seront pas utilisés pour le filtrage, car l'opérateur IN n'est pas pris en charge actuellement.

Pays = AND Catégorie « États-Unis » dans (« Chaussures », « Livres »)

L'index sera utilisé pour récupérer toutes les partitions avec country = "US", puis un filtrage sur l'expression Category sera effectué.

Pays = AND Catégorie « États-Unis » dans (« Chaussures », « Livres ») AND (creationDate > « 2023-9-01 »

L'index sera utilisé pour récupérer toutes les partitions avec country = « US », avec creationDate > '2023-9-01', puis un filtrage sur l'expression de catégorie sera effectué.

Intégration avec les moteurs

Redshift Spectrum, Amazon EMR et AWS Glue ETL Spark peuvent utiliser DataFrames des index pour récupérer des partitions une fois que les index sont dans un état dans. ACTIVE AWS Glue Les cadres Athena et AWS Glue ETL Dynamic nécessitent que vous suiviez des étapes supplémentaires pour utiliser les index afin d'améliorer les requêtes.

Activer le filtrage des partitions

Pour activer le filtrage des partitions dans Athena, vous devez mettre à jour les propriétés de la table comme suit :

  1. Dans la AWS Glue console, sous Catalogue de données, sélectionnez Tables.

  2. Choisissez une table .

  3. Sous Actions, choisissez Modifier le tableau.

  4. Sous Propriétés de la table, ajoutez ce qui suit :

    • Clé — partition_filtering.enabled

    • Valeur — true

  5. Choisissez Appliquer.

Vous pouvez également définir ce paramètre en exécutant une ALTERTABLESETPROPERTIESrequête dans Athena.

ALTER TABLE partition_index.table_with_index SET TBLPROPERTIES ('partition_filtering.enabled' = 'true')