【问题标题】:Scan a table with AWS DynamoDB SDK for Java 2.x使用 AWS DynamoDB SDK for Java 2.x 扫描表
【发布时间】:2018-12-19 17:30:25
【问题描述】:

我在 Amazon DynamoDB 中有一个表 (users),其中包含以下项目:

{
   id: "ef1e44bc-03ad-11e9-8eb2-f2801f1b9fd1", // UUID, HASH key
   version: "3.1",                             // Version string, conforming to semver standards
   emailsEnabled: true,                        // Boolean flag
   capabilities: {                             // Big nested object, not important for the question
      …
   }
}

我想运行临时扫描,以了解有多少 3.1 版用户启用了电子邮件。我这里没有此表的任何索引,但可以进行扫描。

如何使用AWS SDK for Java 2.x 做到这一点?

【问题讨论】:

    标签: amazon-dynamodb aws-java-sdk-2.x


    【解决方案1】:

    您必须使用Filter Expressions 来限制您的应用处理的数据量。

    您还可以使用ProjectionExpressions 删除扫描结果中其他不重要的属性。

    代码如下:

    DynamoDbClient client = DynamoDbClient.builder().build();
    ScanRequest request =
        ScanRequest
            .builder()
            .tableName("users")
            .filterExpression("version = :version")
            .expressionAttributeValues(
                Map.of(":version", AttributeValue.builder().s("3.1").build()) // Using Java 9+ Map.of
            )
            .projectionExpression("id, version, emailsEnabled")
            .build();
    ScanIterable response = client.scanPaginator(request);
    
    for (ScanResponse page : response) {
        for (Map<String, AttributeValue> item : page.items()) {
            // Consume the item
            System.out.println(item);
    
            if (item.get("emailsEnabled").bool()) {
                // Update counters
            }
        }
    }
    

    请注意,在扫描完成后但在返回结果之前应用过滤器表达式。因此,无论是否存在过滤器表达式,一次扫描都会消耗相同数量的读取容量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      相关资源
      最近更新 更多