Java (AWS SDK v2) での DynamoDB Scan
Scan はテーブルまたはインデックス内のすべてのアイテムをページごとに読み取り、その後任意で FilterExpression によって行を除外します。AWS SDK for Java 2.x では、ScanRequest を構築し、組み込みの scanPaginator にテーブル全体が読み取られるまで LastEvaluatedKey を追跡させます。
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());
}
}
}Explanation
filterExpression— 読み取り後に、サーバー側で適用されます。レスポンスを小さくしますが、コストは減りません。フィルターの有無にかかわらず、スキャンしたすべてのアイテムの読み取り分を支払います。expressionAttributeNames— フィルター対象の属性はエイリアス化され(#filter0→Year)、Yearのような予約語を安全に扱えます。- ページネーション — 各
Scanページはフィルター 前 に最大 1 MB を読み取るため、テーブルにまだ一致するものがあってもフィルター後のページが空で返ってくることがあります。ddb.scanPaginator(request)はLastEvaluatedKeyが尽きるまでページをリクエストし続けるScanIterableを返します。最初のページで止めてはいけません。 - ページごとにスキャンされるアイテム数(フィルター前)を制限するには
.limit(...)を追加します。返されるアイテム数は制限しません。 - 大きなフルテーブルスキャンでは、
.segment(...)/.totalSegments(...)でワーカー間に作業を分割します(並列スキャン)。 Queryを優先しましょう。Scanはテーブル全体を読み取ります。ごく小さいテーブル以外では遅く、コストがかかります。
Do it visually
フィルターを手作業で組み立てていますか?DynamoDB Expression Builder は FilterExpression + 名前/値のマップを構築し、実行可能なコードをコピーします。
GUI でテーブルを探索するには(フィルターされページネーションされた結果グリッド、コードとしてコピー)、スクリプトから闇雲にスキャンする代わりに DynoTable をダウンロードしてください。
Related examples
- DynamoDB Scan in Go — AWS SDK for Go v2 による同じスキャン。
- DynamoDB Query in Java — 通常選ぶべきより安価な読み取り。
- Query vs. Scan — (まれに)
Scanが正当化されるのはどんなときか。 - Why is my DynamoDB Scan slow and expensive? — コストモデルとその回避方法。
- DynamoDB ProvisionedThroughputExceededException — フルテーブルスキャンがプロビジョンドテーブルのキャパシティに何をするか。
- DynamoDB ThrottlingException — もう1つのスロットルと、指数バックオフによる対処法。
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
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。