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

说明

  • filterExpression — 在服务端于读取之后应用。它缩小的是响应,而成本:无论是否被过滤,你都要为扫描的每个项目的读取付费。
  • expressionAttributeNames — 被过滤的属性做了别名(#filter0Year),这能让像 Year 这样的保留字保持安全。
  • 分页 — 每个 Scan 页在过滤 之前 最多读取 1 MB,因此当表中仍有匹配时,一个被过滤的页也可能返回为空。ddb.scanPaginator(request) 返回一个 ScanIterable,会不断请求各页直到 LastEvaluatedKey 被耗尽——绝不要在第一页就停下。
  • 加上 .limit(...) 可限制每页扫描(过滤前)的项目数——它不会限制返回的项目数。
  • 对于大型全表扫描,用 .segment(...) / .totalSegments(...) 把工作拆分到多个工作单元(一次并行扫描)。
  • 优先用 Query Scan 会读取整张表;除了很小的表以外,它又慢又贵。

可视化操作

手工拼装过滤器?DynamoDB Expression Builder 会构建 FilterExpression + 名称/值映射并复制可运行代码。

想在 GUI 中探索表——带过滤、分页的结果网格和复制为代码——请下载 DynoTable,而不是从脚本里盲目扫描。

相关示例

References

Last verified 2026-07-13 against the official AWS documentation linked above.

可视化构建此请求

在免费的 DynamoDB 查询构建器中组装此操作 —— 键条件、筛选、索引、Limit、排序方向和分页循环 —— 再把它作为可运行的 SDK v3、CLI 或 boto3 程序复制回来。

打开 DynamoDB 查询构建器

无需控制台即可使用 DynamoDB

DynoTable 是面向 DynamoDB 的快速桌面客户端 —— 浏览表、运行 SQL 风格的查询,并在本地编辑项。