使用DynamoDBMapper扫描DynamoDB项目

之前,我们介绍了如何使用DynamoDBMapper底层Java api查询DynamoDB数据库。

除了发出查询之外,DynamoDB还提供扫描功能。
扫描的目的是获取您在DynamoDB表上可能拥有的所有项目。
因此,扫描不需要任何基于我们的分区键或您的全局/本地二级索引的规则。 扫描提供的功能是基于已获取的项目进行过滤,并从已获取的项目中返回特定属性。

下面的代码段通过过滤具有较低日期的项目来对“登录名”表进行扫描。

public List<Login> scanLogins(Long date) {

        Map<String, String> attributeNames = new HashMap<String, String>();
        attributeNames.put("#timestamp", "timestamp");

        Map<String, AttributeValue> attributeValues = new HashMap<String, AttributeValue>();
        attributeValues.put(":from", new AttributeValue().withN(date.toString()));

        DynamoDBScanExpression dynamoDBScanExpression = new DynamoDBScanExpression()
                .withFilterExpression("#timestamp < :from")
                .withExpressionAttributeNames(attributeNames)
                .withExpressionAttributeValues(attributeValues);

        List<Login> logins = dynamoDBMapper.scan(Login.class, dynamoDBScanExpression);

        return logins;
    }

DynamoDBMapper的另一个重要功能是并行扫描。 并行扫描将扫描任务划分为多个工作程序,每个逻辑段一个。 工作人员并行处理数据并返回结果。
通常,扫描请求的性能在很大程度上取决于DynamoDB表中存储的项目数。 因此,并行扫描可能会解除扫描请求的某些性能问题,因为您必须处理大量数据。

public List<Login> scanLogins(Long date,Integer workers) {

        Map<String, String> attributeNames = new HashMap<String, String>();
        attributeNames.put("#timestamp", "timestamp");

        Map<String, AttributeValue> attributeValues = new HashMap<String, AttributeValue>();
        attributeValues.put(":from", new AttributeValue().withN(date.toString()));

        DynamoDBScanExpression dynamoDBScanExpression = new DynamoDBScanExpression()
                .withFilterExpression("#timestamp < :from")
                .withExpressionAttributeNames(attributeNames)
                .withExpressionAttributeValues(attributeValues);

        List<Login> logins = dynamoDBMapper.parallelScan(Login.class, dynamoDBScanExpression,workers);

        return logins;
    }

在对我们的应用程序使用扫描之前,我们必须考虑到扫描会获取所有表项。 因此,它在费用和性能上都有很高的成本。 此外,它可能会消耗您的配置容量。
通常,最好坚持查询并避免扫描。

您可以在github上找到带有单元测试的完整源代码。

翻译自: https://www.javacodegeeks.com/2016/10/scan-dynamodb-items-dynamodbmapper.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DynamoDB 是一个 NoSQL 数据库,它使用索引来提高查询性能。在 DynamoDB 中,有两种类型的索引:主键索引和辅助索引。 主键索引是 DynamoDB 表的默认索引,它可以是一个简单的主键(仅由一个属性组成)或复合主键(由两个属性组成)。主键索引可以根据主键属性的值进行查找,可以使用等值查询或范围查询。范围查询可以根据主键的排序顺序返回一系列项目。 辅助索引是基于表的非主键属性创建的索引。辅助索引允许你根据非主键属性进行查询,而不仅仅是根据主键属性。辅助索引可以是局部辅助索引(仅包含表的一部分项目)或全局辅助索引(包含整个表的所有项目)。你可以在创建表时定义局部辅助索引,或在表已创建后添加全局辅助索引。 要使用 DynamoDB 索引并进行排序,你需要考虑以下几点: 1. 主键索引:如果你想根据主键属性进行排序,你可以使用范围查询来获取按顺序排列的项目。请注意,只有复合主键才能支持范围查询,简单主键只支持等值查询。 2. 辅助索引:如果你想根据非主键属性进行排序,你可以创建一个辅助索引,并在查询时指定该索引。根据辅助索引的类型(局部或全局),你可以使用等值查询或范围查询来获取排序的结果。 需要注意的是,DynamoDB 不支持在查询时对结果进行排序。排序需要在应用程序中进行处理。你可以通过在查询结果中使用 SortKey 来获取按顺序排列的项目。 希望这个回答能对你有所帮助!如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值