开发手册 欢迎您!
软件开发者资料库

DynamoDB - 扫描

DynamoDB扫描 - 从简单和简单的步骤学习DynamoDB,从基本概念到高级概念,包括概述,基本概念,环境,操作工具,数据类型,创建,加载,查询,删除表,API接口,创建,获取,更新,删除项目,批量写入,批量检索,查询,扫描,索引,全局,本地二级索引,聚合,访问控制,权限API,条件,Web身份联合,数据管道,数据备份,监控,CloudTrail,MapReduce,表活动,错误处理,最佳实践。

扫描操作读取所有表项或二级索引.其默认函数导致返回索引或表中所有项的所有数据属性.在过滤属性中使用 ProjectionExpression 参数.

每次扫描都会返回结果集,即使找不到匹配项也会导致空集.扫描检索不超过1MB,可选择过滤数据.

注意 : 扫描的参数和过滤也适用于查询.

扫描操作类型

过滤号;扫描操作通过过滤器表达式提供精细过滤,过滤器表达式可在扫描或查询后修改数在返回结果之前.表达式使用比较运算符.它们的语法类似于条件表达式,但关键属性除外,过滤器表达式不允许.您不能在过滤器表达式中使用分区或排序键.

注意 : 在任何过滤应用之前适用1MB限制.

吞吐量规格 : 扫描消耗吞吐量,但是,消耗侧重于项目大小而不是返回的数据.无论您是要求每个属性还是只有少数属性,消耗量都保持不变,使用或不使用过滤器表达式也不会影响消费.

分页 :  DynamoDB分页结果导致结果划分为特定页面. 1MB限制适用于返回的结果,当您超过它时,需要进行另一次扫描以收集其余数据. LastEvaluatedKey 值允许您执行此后续扫描.只需将值应用于 ExclusiveStartkey 即可.当 LastEvaluatedKey 值变为null时,操作已完成所有数据页面.但是,非空值不会自动意味着剩余更多数据.只有空值表示状态.

限制参数 :  limit参数管理结果大小. DynamoDB使用它来确定在返回数据之前要处理的项目数,并且不在范围之外工作.如果设置值x,DynamoDB将返回前x个匹配项.

LastEvaluatedKey值也适用于极限参数产生部分结果的情况.用它来完成扫描.

结果计数 : 对查询和扫描的响应还包括与 ScannedCount 和Count相关的信息,这些信息量化扫描/查询的项目并量化返回的项目.如果不进行过滤,则它们的值相同.当您超过1MB时,计数仅代表处理的部分.

一致性 : 查询结果和扫描结果最终是一致读取,但是,您也可以设置强一致性读取.使用 ConsistentRead 参数更改此设置.

注意 : 当设置为强一致时,一致的读取设置会使用双倍容量单位来影响消耗.

性能 : 由于扫描爬满整个表或二级索引,查询提供了比扫描更好的性能,导致响应缓慢和吞吐量大.扫描最适合小型表和使用较少过滤器的搜索,但是,您可以通过遵循一些最佳实践来设计精益扫描,例如避免突然,加速读取活动和利用并行扫描.

A查询查找满足给定条件的特定范围的密钥,其性能由其检索的数据量而不是密钥量决定.操作参数和匹配数特别影响性能.

并行扫描

扫描操作默认按顺序执行处理.然后它们以1MB的份数返回数据,这会提示应用程序获取下一部分.这导致对大型表和索引进行长扫描.

此特性还意味着扫描可能无法始终充分利用可用吞吐量. DynamoDB跨多个分区分发表数据;由于单分区操作,扫描吞吐量仅限于单个分区.

此问题的解决方案来自逻辑上将表或索引划分为段.然后"工人"并行(同时)扫描段.它使用Segment和 TotalSegments 的参数来指定某些工作人员扫描的细分,并指定处理的细分总数.

工人编号

您必须尝试使用工作者值(细分参数)以获得最佳的应用程序性能.

注意 : 大量工作人员的并行扫描通过可能消耗所有吞吐量来影响吞吐量.使用Limit参数管理此问题,您可以使用该参数阻止单个工作程序消耗所有吞吐量.

以下是深度扫描示例.

注意 : 以下程序可以假定先前创建的数据源.在尝试执行之前,获取支持库并创建必要的数据源(具有所需特征的表或其他引用的源).

此示例还使用Eclipse IDE,AWS凭证文件和Eclipse AWS Java项目中的AWS Toolkit.

import java.util.HashMap;import java.util.Iterator;import java.util.Map;import com.amazonaws.auth.profile.ProfileCredentialsProvider;import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;import com.amazonaws.services.dynamodbv2.document.DynamoDB;import com.amazonaws.services.dynamodbv2.document.Item;import com.amazonaws.services.dynamodbv2.document.ItemCollection;import com.amazonaws.services.dynamodbv2.document.ScanOutcome;import com.amazonaws.services.dynamodbv2.document.Table;public class ScanOpSample {     static DynamoDB dynamoDB = new DynamoDB(      new AmazonDynamoDBClient(new ProfileCredentialsProvider()));    static String tableName = "ProductList";        public static void main(String[] args) throws Exception {       findProductsUnderOneHun();                       //finds products under 100 dollars   }     private static void findProductsUnderOneHun() {       Table table = dynamoDB.getTable(tableName);      Map expressionAttributeValues = new HashMap();       expressionAttributeValues.put(":pr", 100);                ItemCollection items = table.scan (          "Price < :pr",                                  //FilterExpression          "ID, Nomenclature, ProductCategory, Price",     //ProjectionExpression          null,                                           //No ExpressionAttributeNames           expressionAttributeValues);               System.out.println("Scanned " + tableName + " to find items under $100.");       Iterator iterator = items.iterator();                while (iterator.hasNext()) {          System.out.println(iterator.next().toJSONPretty());       }        } }