从 Amazon DynamoDB 获取所有行 table

Getting all rows from an Amazon DynamoDB table

我需要从我的 DynamoDB table 中获取所有行。大约有 500k 条记录,每次我从 Java SDK DynamoDBMapper 调用扫描方法时,我都会得到不同数量的行。所以我尝试使用 scanPage 方法并使用 ScanResultPage 对象中的 lastEvaluationKey 进行分页(因为我认为查询结果集大小限制为 1MB)认为它会起作用。但我得到相同的结果。我做了这样的事情:

        List<String> ids = new ArrayList<>();
        DynamoDBScanExpression dynamoDBScanExpression = new DynamoDBScanExpression();
        do {
            ScanResultPage<EntityObject> scanResultPage = dynamoDBMapper.scanPage(EntityObject.class,
                    dynamoDBScanExpression);
            scanResultPage.getResults().forEach(result -> ids.add(result.getId()));
            log.info("Last evaluated key: {}", scanResultPage.getLastEvaluatedKey());
            dynamoDBScanExpression.setExclusiveStartKey(scanResultPage.getLastEvaluatedKey());
        } while (dynamoDBScanExpression.getExclusiveStartKey() != null);

我该怎么做才能真正获得所有行?

您使用的是非常旧的 API,这 API 不是最佳做法。亚马逊推荐 AWS SDK for Java V2.

对于您的用例,请查看使用 Java 2.x 的 AWS 开发工具包检索分页结果。本主题讨论当响应对象太大而无法在单个响应中 return 时如何处理 return 分页结果的 AWS 操作。详情在这里:

Retrieving paginated results using the AWS SDK for Java 2.x

这里有一个示例演示了如何使用异步 DynamoDB 客户端进行自动分页

https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/dynamodbasync/src/main/java/com/example/dynamodbasync/AsyncPagination.java

在 Java 1.0 的 AWS 开发工具包中,响应包含一个令牌,您必须使用该令牌来检索下一页结果。 Java 2.x 的 AWS 开发工具包中的新功能是自动分页方法,可以调用多个服务来为您获取下一页结果。