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é (#filter0Year), ce qui met à l'abri les mots réservés comme Year.
  • Pagination — chaque page de Scan lit 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 un ScanIterable qui continue de demander des pages jusqu'à épuisement de LastEvaluatedKey — 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. Scan lit 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

References

Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.

Construis cette requête visuellement

Compose cette opération dans le Générateur de requêtes DynamoDB gratuit — condition de clé, filtre, index, Limit, ordre de tri et boucle de pagination — et copie-la en retour comme programme exécutable SDK v3, CLI ou boto3.

Ouvrir le Générateur de requêtes DynamoDB

Travaille avec DynamoDB sans la Console

DynoTable est un client de bureau rapide pour DynamoDB — parcours les tables, exécute des requêtes de style SQL et édite les items en local.