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— 被过滤的属性做了别名(#filter0→Year),这能让像Year这样的保留字保持安全。- 分页 — 每个
Scan页在过滤 之前 最多读取 1 MB,因此当表中仍有匹配时,一个被过滤的页也可能返回为空。ddb.scanPaginator(request)返回一个ScanIterable,会不断请求各页直到LastEvaluatedKey被耗尽——绝不要在第一页就停下。 - 加上
.limit(...)可限制每页扫描(过滤前)的项目数——它不会限制返回的项目数。 - 对于大型全表扫描,用
.segment(...)/.totalSegments(...)把工作拆分到多个工作单元(一次并行扫描)。 - 优先用
Query。Scan会读取整张表;除了很小的表以外,它又慢又贵。
可视化操作
手工拼装过滤器?DynamoDB Expression Builder 会构建 FilterExpression + 名称/值映射并复制可运行代码。
想在 GUI 中探索表——带过滤、分页的结果网格和复制为代码——请下载 DynoTable,而不是从脚本里盲目扫描。
相关示例
- Go 中的 DynamoDB Scan — 用 AWS SDK for Go v2 完成同样的扫描。
- Java 中的 DynamoDB Query — 你通常应该选择的更便宜的读取。
- Query vs. Scan — 何时(很少)
Scan是合理的。 - 为什么我的 DynamoDB Scan 又慢又贵? — 成本模型以及如何避免。
- DynamoDB ProvisionedThroughputExceededException — 全表扫描对预置表的容量有何影响。
- DynamoDB ThrottlingException — 另一种限流,以及指数退避如何应对它。
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
Last verified 2026-07-13 against the official AWS documentation linked above.