Scan DynamoDB en Java (AWS SDK v2)
Scan lit chaque élément d'une table ou d'un index, page par page, puis élimine optionnellement des lignes avec une FilterExpression. Dans AWS SDK pour Java 2.x, tu construis un ScanRequest et laisses le scanPaginator intégré suivre LastEvaluatedKey jusqu'à ce que toute la table soit lue.
Code
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.ScanRequest;
import software.amazon.awssdk.services.dynamodb.model.ScanResponse;
public class ScanExample {
public static void main(String[] args) {
try (DynamoDbClient ddb = DynamoDbClient.builder()
.region(Region.US_EAST_1)
.build()) {
Map<String, String> names = new HashMap<>();
names.put("#filter0", "Year");
Map<String, AttributeValue> values = new HashMap<>();
values.put(":filterValue0", AttributeValue.builder().n("2010").build());
ScanRequest request = ScanRequest.builder()
.tableName("Music")
.filterExpression("#filter0 >= :filterValue0")
.expressionAttributeNames(names)
.expressionAttributeValues(values)
.build();
List<Map<String, AttributeValue>> items = new ArrayList<>();
for (ScanResponse page : ddb.scanPaginator(request)) {
items.addAll(page.items());
}
System.out.println("Matched " + items.size() + " items");
} catch (DynamoDbException e) {
System.err.println(e.getMessage());
}
}
}Explication
filterExpression— appliquée après la lecture, côté serveur. Elle réduit la réponse mais pas le coût : tu paies pour lire chaque élément scanné, filtré ou non.expressionAttributeNames— l'attribut filtré est aliasé (#filter0→Year), ce qui met à l'abri les mots réservés commeYear.- Pagination — chaque page de
Scanlit au plus 1 Mo avant filtrage, donc une page filtrée peut revenir vide alors que la table contient encore des correspondances.ddb.scanPaginator(request)renvoie unScanIterablequi continue de demander des pages jusqu'à épuisement deLastEvaluatedKey— ne t'arrête jamais à la première page. - Ajoute
.limit(...)pour plafonner le nombre d'éléments scannés par page (avant filtrage) — il ne plafonne pas le nombre d'éléments renvoyés. - Pour un gros scan de table complète, répartis le travail entre des workers avec
.segment(...)/.totalSegments(...)(un scan parallèle). - Préfère
Query.Scanlit toute la table ; sur autre chose qu'une table minuscule, c'est lent et coûteux.
À faire visuellement
Tu assembles un filtre à la main ? Le DynamoDB Expression Builder construit la FilterExpression + les maps de noms/valeurs et copie du code exécutable.
Pour explorer des tables dans une interface graphique — avec des grilles de résultats filtrées et paginées, et la copie du code — télécharge DynoTable, au lieu de scanner à l'aveugle depuis un script.
Exemples liés
- Scan DynamoDB en Go — le même scan avec AWS SDK pour Go v2.
- Query DynamoDB en Java — la lecture moins chère vers laquelle tu devrais généralement te tourner.
- Query vs. Scan — quand (rarement) un
Scanest justifié. - Pourquoi mon Scan DynamoDB est-il lent et coûteux ? — le modèle de coût et comment l'éviter.
- DynamoDB ProvisionedThroughputExceededException — ce qu'un scan de table complète fait à la capacité d'une table provisionnée.
- DynamoDB ThrottlingException — l'autre étranglement, et comment le backoff exponentiel le gère.
References
- Scan — Amazon DynamoDB API Reference
- Use Scan with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- DynamoDbClient — AWS SDK for Java 2.x API Reference
- ScanRequest — AWS SDK for Java 2.x API Reference
- Scanning tables — Amazon DynamoDB Developer Guide
Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.