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.
Au fil du temps, des centaines de milliers de partitions sont ajoutées à une table. L'GetPartitions API est utilisée pour récupérer les partitions de la table. L'API renvoie les partitions qui 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 envoyer une GetPartitions
demande au catalogue de données avec l'expression « Category = 'Books' et CreationDate > '2020-08-15' ».
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 GetPartitions
demande. 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.
Rubriques
À 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, creationDate), (pays, catégorie, année), (pays, catégorie), (pays), (catégorie), (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 format ISO, telle que
YYYY-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 avec 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 de l'index de partition sera facturé en fonction du prix actuel AWS Glue politique tarifaire pour le stockage de catalogues de données. Pour plus de détails sur la tarification des objets de stockage, voir AWS Glue tarification
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 de l’API GetPartitionIndexes
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 réussit, l'indexStatus est mis à jour sur ACTIVE et pour un processus infructueux, l'état de l'index est mis à jour sur FAILED. 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 avec des partitions chiffrées n'est pas prise en charge.
INVALID_PARTITION_TYPE_DATA_ERROR – observé lorsque la valeur
partitionKey
n'est pas une valeur valide pour le type de donnéespartitionKey
correspondant. Par exemple : unpartitionKey
avec le type de données 'int' a une valeur 'foo'.MISSING_PARTITION_VALUE_ERROR – observé lorsque le for
partitionValue
pour unindexedKey
est absent. 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 demandeDeletePartitionIndex
, qui fait passer l'état 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 (category, year) où la catégorie est de type string
et l'année de type int
, la création de la nouvelle partition avec une valeur de YEAR telle que "foo" échouera.
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é. |
Country = 'US' AND Category = 'Shoes' OR Year > '2018' |
Les index ne seront pas utilisés, car un opérateur |
Country = 'US' AND Category = 'Shoes' AND (Year = 2017 OR Year = '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é. |
Country in ('US', 'UK') AND Category = 'Shoes' |
Les index ne seront pas utilisés pour le filtrage, car l'opérateur |
Country = 'US' AND Category in ('Shoes', 'Books') |
L'index sera utilisé pour récupérer toutes les partitions avec country = "US", puis un filtrage sur l'expression Category sera effectué. |
Pays = « États-Unis » ET catégorie dans (« Chaussures », « Livres ») ET (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 Category sera effectué. |
Intégration avec les moteurs
Redshift Spectrum, Amazon EMR et AWS Glue ETL Spark DataFrames est capable d'utiliser des index pour récupérer des partitions une fois que les index sont dans un état ACTIF dans AWS Glue. Athéna et AWS Glue Les cadres dynamiques ETL vous obligent à suivre 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 :
Dans la AWS Glue console, sous Catalogue de données, sélectionnez Tables.
Choisissez une table .
Sous Actions, choisissez Modifier le tableau.
Sous Propriétés de la table, ajoutez ce qui suit :
Clé —
partition_filtering.enabled
Valeur —
true
Choisissez Appliquer.
Vous pouvez également définir ce paramètre en exécutant une requête ALTER TABLE SET PROPERTIES dans Athena.
ALTER TABLE partition_index.table_with_index
SET TBLPROPERTIES ('partition_filtering.enabled' = 'true')