DynamoDB Scan in Java (AWS SDK v2)

Scan liest jedes Item in einer Tabelle oder einem Index, Seite für Seite, und verwirft dann optional Zeilen mit einer FilterExpression. Im AWS SDK for Java 2.x baust du einen ScanRequest und lässt den eingebauten scanPaginator LastEvaluatedKey folgen, bis die ganze Tabelle gelesen ist.

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());
        }
    }
}

Erklärung

  • filterExpressionnach dem Read angewendet, auf dem Server. Sie verkleinert die Antwort, nicht die Kosten: du bezahlst, um jedes gescannte Item zu lesen, gefiltert oder nicht.
  • expressionAttributeNames — das gefilterte Attribut wird aliasiert (#filter0Year), was reservierte Wörter wie Year absichert.
  • Pagination — jede Scan-Seite liest höchstens 1 MB vor dem Filtern, sodass eine gefilterte Seite leer zurückkommen kann, während die Tabelle noch Treffer hat. ddb.scanPaginator(request) gibt ein ScanIterable zurück, das weiter Seiten anfordert, bis LastEvaluatedKey erschöpft ist — höre nie bei der ersten Seite auf.
  • Füge .limit(...) hinzu, um die pro Seite gescannten Items zu begrenzen (vor dem Filtern) — es begrenzt nicht die zurückgegebenen Items.
  • Für einen großen Full-Table-Scan teile die Arbeit auf Worker mit .segment(...) / .totalSegments(...) (ein Parallel-Scan).
  • Bevorzuge Query. Scan liest die ganze Tabelle; bei allem außer einer winzigen Tabelle ist das langsam und teuer.

Visuell erledigen

Einen Filter von Hand zusammenbauen? Der DynamoDB Expression Builder baut die FilterExpression + Name-/Wert-Maps und kopiert lauffähigen Code.

Um Tabellen in einer GUI zu erkunden — mit gefilterten, paginierten Ergebnisrastern und Copy-as-Code — lade DynoTable herunter, statt blind aus einem Skript zu scannen.

Verwandte Beispiele

References

Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.

Diesen Request visuell bauen

Stelle diese Operation im kostenlosen DynamoDB Query Builder zusammen — Key-Bedingung, Filter, Index, Limit, Sortierreihenfolge und eine Paginierungsschleife — und kopiere sie als lauffähiges SDK-v3-, CLI- oder boto3-Programm zurück.

DynamoDB Query Builder öffnen

Mit DynamoDB ohne die Console arbeiten

DynoTable ist ein schneller Desktop-Client für DynamoDB — durchsuche Tabellen, führe SQL-artige Queries aus und bearbeite Items lokal.