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 — フィルター対象の属性はエイリアス化され(#filter0Year)、Year のような予約語を安全に扱えます。
  • ページネーション — 各 Scan ページはフィルター に最大 1 MB を読み取るため、テーブルにまだ一致するものがあってもフィルター後のページが空で返ってくることがあります。ddb.scanPaginator(request)LastEvaluatedKey が尽きるまでページをリクエストし続ける ScanIterable を返します。最初のページで止めてはいけません。
  • ページごとにスキャンされるアイテム数(フィルター前)を制限するには .limit(...) を追加します。返されるアイテム数は制限しません。
  • 大きなフルテーブルスキャンでは、.segment(...) / .totalSegments(...) でワーカー間に作業を分割します(並列スキャン)。
  • Query を優先しましょう。 Scan はテーブル全体を読み取ります。ごく小さいテーブル以外では遅く、コストがかかります。

Do it visually

フィルターを手作業で組み立てていますか?DynamoDB Expression BuilderFilterExpression + 名前/値のマップを構築し、実行可能なコードをコピーします。

GUI でテーブルを探索するには(フィルターされページネーションされた結果グリッド、コードとしてコピー)、スクリプトから闇雲にスキャンする代わりに DynoTable をダウンロードしてください。

References

最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

このリクエストをビジュアルに組み立てる

この操作を無料の DynamoDB クエリビルダーで組み立て — キー条件、フィルタ、インデックス、Limit、ソート順、ページネーションループ — 実行可能な SDK v3・CLI・boto3 のプログラムとしてコピーして戻れます。

DynamoDB クエリビルダーを開く

Console なしで DynamoDB を扱う

DynoTable は DynamoDB 向けの高速なデスクトップクライアントです — テーブルを閲覧し、SQL スタイルのクエリを実行し、アイテムをローカルで編集できます。