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
filterExpression— nach 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 (#filter0→Year), was reservierte Wörter wieYearabsichert.- 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 einScanIterablezurück, das weiter Seiten anfordert, bisLastEvaluatedKeyerschö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.Scanliest 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
- DynamoDB Scan in Go — derselbe Scan mit AWS SDK for Go v2.
- DynamoDB Query in Java — der günstigere Read, zu dem du normalerweise greifen solltest.
- Query vs. Scan — wann (selten) ein
Scangerechtfertigt ist. - Warum ist mein DynamoDB-Scan langsam und teuer? — das Kostenmodell und wie du es vermeidest.
- DynamoDB ProvisionedThroughputExceededException — was ein Full-Table-Scan der Kapazität einer Provisioned-Tabelle antut.
- DynamoDB ThrottlingException — das andere Throttle und wie exponentielles Backoff damit umgeht.
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
Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.