扫描计数返回显着少于dynamodb表的数字

时间:2014-04-07 15:31:05

标签: java amazon-web-services amazon-dynamodb

我正在运行一个示例java程序来查询一个dynamodb表,该表有大约90000个项目但是当我从java获得扫描计数时它只显示了1994个项目

 ScanRequest scanRequest = new ScanRequest().withTableName(tableName);
 ScanResult result = client.scan(scanRequest);
 System.out.println("#items:" + result.getScannedCount());

程序输出#items:1994 但亚马逊aws控制台的细节显示:

项目数*:89249

任何想法? 感谢

5 个答案:

答案 0 :(得分:5)

扫描或查询dynamodb仅返回最多1MB的数据。 计数是适合1MB的退货项目数。为了获得整个表,您应该积极地扫描数据库,直到值LastEvaluatedKey为空

答案 1 :(得分:4)

使用正确的哈希键值设置book对象,并使用DynamoDBMapper获取计数。

DynamoDBQueryExpression<Book> queryExpression = new DynamoDBQueryExpression<Book>()
                .withHashKeyValues(book);
dynamoDbMapper.count(Book.class, queryExpression);

答案 2 :(得分:1)

这应该有所帮助。为我工作

        AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
                                .withRegion("your region").build();
        DynamoDB dynamoDB = new DynamoDB(client);
        TableDescription tableDescription = dynamoDB.getTable("table name").describe();
        tableDescription.getItemCount();

答案 3 :(得分:0)

根据nightograph

的回答
private ArrayList<String> fetchItems() {
    ArrayList<String> ids = new ArrayList<>();
    ScanResult result = null;
    do {
        ScanRequest req = new ScanRequest();
        req.setTableName("table_name");
        if (result != null) {
            req.setExclusiveStartKey(result.getLastEvaluatedKey());
        }
        result = amazonDynamoDBClient.scan(req);
        List<Map<String, AttributeValue>> rows = result.getItems();
        for (Map<String, AttributeValue> map : rows) {
            AttributeValue v = map.get("rangeKey");
            String id = v.getS();
            ids.add(id);
        }
    } while (result.getLastEvaluatedKey() != null);
    System.out.println("Result size: " + ids.size());
    return ids;
}

答案 4 :(得分:-3)

我同意了夜视仪。我认为这个链接很有用。

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html

我刚用这个例子测试过。无论如何这是Dyanamodb v2。

 final ScanRequest scanRequest = new ScanRequest()
                    .withTableName("table_name");
 final ScanResult result = dynamoDB.scan(scanRequest);
 return result.getCount();