DynamoDB Scan di Java (AWS SDK v2)
Scan membaca setiap item dalam sebuah tabel atau index, halaman demi halaman, lalu secara opsional membuang baris dengan FilterExpression. Di AWS SDK for Java 2.x Anda membangun ScanRequest dan membiarkan scanPaginator bawaan mengikuti LastEvaluatedKey hingga seluruh tabel terbaca.
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());
}
}
}Penjelasan
filterExpression— diterapkan setelah pembacaan, di server. Ia mengecilkan response tetapi bukan biayanya: Anda membayar untuk membaca setiap item yang di-scan, terfilter atau tidak.expressionAttributeNames— atribut yang difilter diberi alias (#filter0→Year), yang menjaga reserved word sepertiYeartetap aman.- Paginasi — setiap halaman
Scanmembaca paling banyak 1 MB sebelum pemfilteran, jadi halaman yang difilter bisa kembali kosong sementara tabel masih memiliki kecocokan.ddb.scanPaginator(request)mengembalikanScanIterableyang terus meminta halaman hinggaLastEvaluatedKeyhabis — jangan pernah berhenti di halaman pertama. - Tambahkan
.limit(...)untuk membatasi item yang di-scan per halaman (pra-filter) — ia tidak membatasi item yang dikembalikan. - Untuk scan seluruh tabel yang besar, bagi pekerjaan antar worker dengan
.segment(...)/.totalSegments(...)(sebuah parallel scan). - Lebih baik gunakan
Query.Scanmembaca seluruh tabel; pada apa pun selain tabel yang sangat kecil, ia lambat dan mahal.
Lakukan secara visual
Menyusun filter dengan tangan? DynamoDB Expression Builder membangun FilterExpression + map name/value dan menyalin kode yang bisa dijalankan.
Untuk menjelajahi tabel di GUI — dengan grid hasil yang terfilter dan berpaginasi serta copy-as-code — unduh DynoTable, alih-alih scan membabi buta dari sebuah script.
Contoh terkait
- DynamoDB Scan di Go — scan yang sama dengan AWS SDK for Go v2.
- DynamoDB Query di Java — pembacaan yang lebih murah yang biasanya harus Anda pilih.
- Query vs. Scan — kapan (jarang) sebuah
Scandibenarkan. - Mengapa DynamoDB Scan saya lambat dan mahal? — model biaya dan cara menghindarinya.
- DynamoDB ProvisionedThroughputExceededException — apa yang dilakukan scan seluruh tabel terhadap kapasitas tabel provisioned.
- DynamoDB ThrottlingException — throttle lainnya, dan bagaimana exponential backoff menanganinya.
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
Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.