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.
Numérisation de tables dans DynamoDB
Une opération Scan
dans Amazon DynamoDB lit tous les éléments d'une table ou d'un index secondaire. Par défaut, une opération Scan
retourne tous les attributs de données pour chaque élément de la table ou de l'index. Vous pouvez utiliser le paramètre ProjectionExpression
de telle sorte que Scan
retourne uniquement certains des attributs, plutôt que leur totalité.
Scan
retourne toujours un jeu de résultats. Si aucun élément correspondant n'est trouvé, le jeu de résultats est vide.
Une seule demande Scan
peut extraire un maximum de 1 Mo de données. Le cas échéant, DynamoDB peut appliquer une expression de filtre à ces données, en affinant les résultats avant qu'ils soient renvoyés à l'utilisateur.
Rubriques
Filtrer les expressions pour l'opération d'analyse
Si vous avez besoin d'affiner davantage les résultats de l'opération Scan
, vous pouvez fournir une expression de filtre facultative. Une expression de filtre détermine les éléments dans les résultats de Scan
qui doivent vous être renvoyés. Tous les autres résultats sont ignorés.
Une expression de filtre est appliquée après la fin de l'opération Scan
, mais avant que les résultats soient renvoyés. Par conséquent, une opération Scan
utilise la même capacité de lecture, qu'une expression de filtre soit présente ou non.
Une opération Scan
peut extraire au maximum 1 Mo de données. Cette limite s'applique avant que l'expression de filtre soit évaluée.
Avec Scan
, vous pouvez spécifier tous les attributs dans une expression de filtre, y compris les attributs de clé de partition et de clé de tri.
La syntaxe d'un expression de filtre est identique à celle d'une expression de condition. Les expressions de filtre peuvent utiliser les mêmes comparateurs, fonctions et opérateurs logiques qu'une expression de condition. Pour plus d'informations sur les opérateurs, consultez Conditionnez et filtrez les expressions, les opérateurs et les fonctions dans DynamoDB.
Exemple
L'exemple suivant AWS Command Line Interface (AWS CLI) analyse le Thread
tableau et ne renvoie que les derniers éléments publiés par un utilisateur en particulier.
aws dynamodb scan \ --table-name Thread \ --filter-expression "LastPostedBy = :name" \ --expression-attribute-values '{":name":{"S":"User A"}}'
Limiter le nombre d'éléments dans le jeu de résultats
L'opération Scan
permet de limiter le nombre d'éléments renvoyés dans le résultat. Pour ce faire, définissez le paramètre Limit
sur le nombre maximal d'éléments que vous souhaitez que l'opération Scan
retourne, avant l'évaluation de l'expression de filtre.
Par exemple, supposons que vous effectuiez une opération Scan
sur une table, avec une valeur Limit
de 6
et sans expression de filtre. Le résultat Scan
contient les six premiers éléments de la table.
Supposons maintenant que vous ajoutiez une expression de filtre à l'opération Scan
. Dans ce cas, DynamoDB applique l'expression de filtre aux six éléments renvoyés et supprime ceux qui ne correspondent pas. Le résultat final Scan
contient six éléments au plus, selon le nombre d'éléments filtrés.
Pagination des résultats
DynamoDB pagine les résultats des opérations Scan
. Avec la pagination, les résultats Scan
sont répartis en « pages » de données d'une taille maximum de 1 Mo. Une application peut traiter la première page des résultats, puis la deuxième page, et ainsi de suite.
Une opération Scan
retourne uniquement un ensemble de résultats correspondant à la limite de taille de 1 Mo.
Pour déterminer si le nombre de résultats est plus important et pour récupérer une page à la fois, les applications doivent procéder de la manière suivante :
-
Examinez le résultat de
Scan
de niveau inférieur :-
Si le résultat contient un élément
LastEvaluatedKey
, passez à l'étape 2. -
S'il n'y a pas de
LastEvaluatedKey
dans le résultat, il n'y a plus aucun élément à récupérer.
-
-
Construisez une nouvelle demande
Scan
, avec les mêmes paramètres que la précédente. Cependant, cette fois, acceptez la valeurLastEvaluatedKey
de l'étape 1 et utilisez-la comme paramètreExclusiveStartKey
dans la nouvelle demandeScan
. -
Exécutez la nouvelle demande
Scan
. -
Passez à l'étape 1.
En d'autres termes, l'élément LastEvaluatedKey
provenant d'une réponse Scan
doit être utilisé comme ExclusiveStartKey
pour la demande Scan
suivante. Si aucun élément LastEvaluatedKey
n'est présent dans la réponse Scan
, vous avez extrait la dernière page de résultats. (L'absence de LastEvaluatedKey
est le seul moyen de savoir que vous avez atteint la fin du jeu de résultats.)
Vous pouvez utiliser le AWS CLI pour visualiser ce comportement. AWS CLI envoie des Scan
requêtes de bas niveau à DynamoDB, à plusieurs reprises, LastEvaluatedKey
jusqu'à ce qu'elles ne soient plus présentes dans les résultats. Prenons l' AWS CLI exemple suivant qui scanne l'intégralité du Movies
tableau mais ne renvoie que les films d'un genre particulier.
aws dynamodb scan \ --table-name Movies \ --projection-expression "title" \ --filter-expression 'contains(info.genres,:gen)' \ --expression-attribute-values '{":gen":{"S":"Sci-Fi"}}' \ --page-size 100 \ --debug
Normalement, il AWS CLI gère automatiquement la pagination. Toutefois, dans cet exemple, le AWS CLI --page-size
paramètre limite le nombre d'éléments par page. La paramètre --debug
imprime les informations de niveau inférieur relatives aux requêtes et aux réponses.
Note
Vos résultats de pagination diffèrent également en fonction des paramètres d'entrée que vous transmettez.
L'utilisation de
aws dynamodb scan --table-name Prices --max-items 1
renvoie unNextToken
L’utilisation de
aws dynamodb scan --table-name Prices --limit 1
renvoie unLastEvaluatedKey
.
Sachez également que l'utilisation de --starting-token
en particulier requiert la valeur NextToken
.
Si vous exécutez l'exemple, la première réponse de DynamoDB est à similaire à ce qui suit.
2017-07-07 12:19:14,389 - MainThread - botocore.parsers - DEBUG - Response body: b'{"Count":7,"Items":[{"title":{"S":"Monster on the Campus"}},{"title":{"S":"+1"}}, {"title":{"S":"100 Degrees Below Zero"}},{"title":{"S":"About Time"}},{"title":{"S":"After Earth"}}, {"title":{"S":"Age of Dinosaurs"}},{"title":{"S":"Cloudy with a Chance of Meatballs 2"}}], "LastEvaluatedKey":{"year":{"N":"2013"},"title":{"S":"Curse of Chucky"}},"ScannedCount":100}'
Le LastEvaluatedKey
de la réponse indique que certains éléments n'ont pas été récupérés. Il envoie AWS CLI ensuite une autre Scan
demande à DynamoDB. Ce modèle de requête et de réponse se poursuit jusqu'à l'obtention d'une réponse finale.
2017-07-07 12:19:17,830 - MainThread - botocore.parsers - DEBUG - Response body: b'{"Count":1,"Items":[{"title":{"S":"WarGames"}}],"ScannedCount":6}'
L'absence de LastEvaluatedKey
indique qu'il n'y a pas plus de d'élément à récupérer.
Note
Ils AWS SDKs gèrent les réponses DynamoDB de bas niveau (y compris la présence ou l'absence de) et fournissent diverses abstractions pour LastEvaluatedKey
la pagination des résultats. Scan
Par exemple, l'interface documentaire SDK pour Java fournit un java.util.Iterator
support qui vous permet de parcourir les résultats un par un.
Pour obtenir des exemples de code dans différents langages de programmation, consultez le guide de démarrage Amazon DynamoDB et AWS SDK la documentation de votre langage.
Comptabilisation des éléments dans les résultats
Outre les éléments qui correspondent à vos critères, la réponse d'une opération Scan
contient les éléments suivants :
-
ScannedCount
– Nombre d'éléments évalués avant l'application deScanFilter
. Une valeurScannedCount
élevée avec peu ou pas de résultatsCount
indique une opérationScan
inefficace. Si vous n'avez pas utilisé de filtre dans la demande,ScannedCount
etCount
ont la même valeur. -
Count
– Nombre d'éléments qui restent après l'application d'une expression de filtre (le cas échéant).
Note
Si vous n'utilisez pas d'expression de filtre, alors ScannedCount
et Count
ont la même valeur.
Si la taille de l'ensemble de résultats Scan
est supérieure à 1 Mo, les opérations ScannedCount
et Count
représentent seulement un compte partiel du total des éléments. Vous devez effectuer plusieurs opérations Scan
pour pouvoir extraire tous les résultats (consultez Pagination des résultats).
Chaque réponse Scan
contient les ScannedCount
et Count
des éléments traités par cette demande Scan
particulière. Pour obtenir les totaux de toutes les demandes Scan
, vous pouvez garder un compte actif de ScannedCount
et de Count
.
Unités de capacité consommées par l'opération d'analyse
Vous pouvez effectuer une opération Scan
sur un table ou un index secondaire quelconques. Les opérations Scan
consomment des unités de capacité de lecture, comme suit.
Si vous effectuez une opération Scan sur... |
DynamoDB consomme des unités de capacité de lecture de… |
---|---|
Tableau | Capacité de lecture allouée à la table. |
Index secondaire global | Capacité de lecture allouée à l'index. |
Index secondaire local | Capacité de lecture allouée à la table de base. |
Par défaut, l'opération Scan
ne renvoie pas de données concernant la consommation de capacité de lecture. Vous pouvez toutefois spécifier le paramètre ReturnConsumedCapacity
dans une demande Scan
pour obtenir ces informations. Les paramètres suivants sont valides pour ReturnConsumedCapacity
:
-
NONE
– Aucune donnée de capacité consommée n'est renvoyée. (Il s'agit de l'option par défaut.) TOTAL
– La réponse inclut le nombre agrégé d'unités de capacité de lecture consommées.INDEXES
– La réponse indique le nombre agrégé d'unités de capacité de lecture consommées, ainsi que la capacité consommée pour chaque table et index consultés.
DynamoDB calcule le nombre d'unités de capacité de lecture consommées en fonction du nombre d'éléments et de leur taille, et non en fonction de la quantité de données renvoyées à une application. Pour cette raison, le nombre d'unités de capacité consommées sera le même que vous demandiez tous les attributs (comportement par défaut) ou seulement certains d'entre eux (avec une expression de projection). Le nombre est également le même, que vous utilisiez ou non une expression de filtre. Scan
consomme une unité de capacité de lecture minimale pour effectuer une lecture hautement cohérente par seconde, ou deux lectures éventuellement cohérentes par seconde pour un élément d'une taille maximale de 4 Ko. Si vous devez lire un élément d'une taille supérieure à 4 Ko, DynamoDB a besoin d'unités de demande de lecture supplémentaires. Les tables vides et les très grandes tables contenant peu de clés de partition peuvent entraîner des RCUs frais supplémentaires au-delà de la quantité de données numérisées. Cela couvre les frais de traitement de la Scan
demande, même en l'absence de données.
Cohérence en lecture de l'opération d'analyse
Par défaut, une opération Scan
effectue des lectures éventuellement cohérentes. Cela signifie que les résultats de l'opération Scan
peuvent ne pas refléter des modifications apportées par des opérations PutItem
ou UpdateItem
récentes. Pour de plus amples informations, veuillez consulter Cohérence de lecture DynamoDB.
Si vous avez besoin de lectures cohérentes fortes au moment où l'opération Scan
commence, définissez le paramètre ConsistentRead
à la valeur true
dans la demande Scan
. Cela garantit que toutes les opérations d'écriture qui ont pris fin avant que l'opération Scan
ne commence seront incluses dans la réponse Scan
.
La définition de ConsistentRead
sur true
peut être utile dans la sauvegarde des tables ou les scénarios de réplication, en conjonction avec DynamoDB Streams. Vous utilisez d'abord Scan
avec ConsistentRead
définie sur la valeur true pour obtenir une copie cohérente des données de la table. Pendant l'opération Scan
, DynamoDB Streams enregistre toute activité d'écriture supplémentaires qui se produit sur la table. Une fois l'opération Scan
terminée, vous pouvez appliquer l'activité d'écriture du flux vers la table.
Note
Notez qu'une opération Scan
avec ConsistentRead
ayant la valeur true
consomme deux fois plus d'unités de capacité en lecture, par comparaison avec le fait de laisser ConsistentRead
à sa valeur par défaut (false
).
Analyse parallèle
Par défaut, l'opération Scan
traite les données de manière séquentielle. Amazon DynamoDB renvoie des données à l'application par incréments de 1 Mo, et une application effectue des opérations Scan
supplémentaires pour extraire le Mo de données suivant.
Plus la table ou l'index en cours d'analyse sont grands, plus l'opération Scan
prend du temps. En outre, il arrive qu'une opération Scan
séquentielle ne puisse pas utiliser pleinement la capacité de débit de lecture approvisionné. Même si DynamoDB distribue les données d'une grande table sur plusieurs partitions physiques, une opération Scan
ne peut lire qu'une seule partition à la fois. C'est pourquoi le débit d'une opération Scan
est limité par le débit maximum d'une partition.
Pour résoudre ce problème, l'opération Scan
peut diviser logiquement une table ou un index secondaire en plusieurs segments, et avoir plusieurs employés d'application qui analysent les segments en parallèle. Chaque employé peut être une unité d'exécution (quand le langage de programmation prend en charge les unités d'exécution multiples) ou un processus de système d'exploitation. Pour effectuer une analyse en parallèle, chaque employé émet sa propre demande Scan
avec les paramètres suivants :
-
Segment
– Segment à analyser par un employé particulier. Chaque employé doit utiliser une valeur différente pourSegment
. -
TotalSegments
– Nombre total de segments pour l'analyse en parallèle. Cette valeur doit être identique au nombre d'employés que votre application va utiliser.
Le diagramme suivant illustre la manière dont une application à unités d'exécution multiple exécute une opération Scan
en parallèle avec trois degrés de parallélisme.
Dans ce diagramme, l'application produit trois unités d'exécution auxquels elle attribue un numéro (les segments étant de base zéro, le premier numéro est toujours 0). Chaque unité d'exécution émet une demande Scan
, définissant la valeur Segment
sur son numéro désigné, et la valeur TotalSegments
sur 3. Chaque unité d'exécution analyse son segment désigné en extrayant des données 1 Mo à la fois, et renvoie les données au thread principal de l'application.
Les valeurs Segment
et TotalSegments
s'appliquent à des demandes Scan
individuelles, et vous pouvez utiliser différentes valeurs à tout moment. Il se peut que vous deviez expérimenter ces valeurs et le nombre d'employés que vous utilisez, jusqu'à ce que votre application atteigne des performances optimales.
Note
Une analyse en parallèle avec un grand nombre d'employés peut facilement consommer tout le débit approvisionné pour la table ou l'index analysé. Il est préférable d'éviter de telles analyses si d'autres applications soumettent également la table ou l'index à une intense activité de lecture ou d'écriture.
Pour contrôler la quantité de données renvoyées par demande, utilisez le paramètre Limit
. Cela peut vous aider à éviter des situations où un employé consomme tout le débit approvisionné, au détriment des autres employés.