- DynamoDB 教程
- DynamoDB - 首页
- DynamoDB - 概述
- DynamoDB - 基本概念
- DynamoDB - 环境
- DynamoDB - 操作工具
- DynamoDB - 数据类型
- DynamoDB - 创建表
- DynamoDB - 加载表
- DynamoDB - 查询表
- DynamoDB - 删除表
- DynamoDB - API 接口
- DynamoDB - 创建项目
- DynamoDB - 获取项目
- DynamoDB - 更新项目
- DynamoDB - 删除项目
- DynamoDB - 批量写入
- DynamoDB - 批量检索
- DynamoDB - 查询
- DynamoDB - 扫描
- DynamoDB - 索引
- 全局二级索引
- 局部二级索引
- DynamoDB - 聚合
- DynamoDB - 访问控制
- DynamoDB - 权限 API
- DynamoDB - 条件
- Web 身份联合
- DynamoDB - 数据管道
- DynamoDB - 数据备份
- DynamoDB - 监控
- DynamoDB - CloudTrail
- DynamoDB - MapReduce
- DynamoDB - 表活动
- DynamoDB - 错误处理
- DynamoDB - 最佳实践
- DynamoDB 有用资源
- DynamoDB - 快速指南
- DynamoDB - 有用资源
- DynamoDB - 讨论
DynamoDB - 扫描
扫描操作读取所有表项或二级索引。其默认功能会返回索引或表中所有项目的所有数据属性。使用ProjectionExpression参数过滤属性。
每次扫描都会返回一个结果集,即使没有找到匹配项,也会返回一个空集。扫描最多检索 1MB 数据,并可以选择过滤数据。
注意 - 扫描的参数和过滤也适用于查询。
扫描操作类型
过滤 - 扫描操作通过过滤器表达式提供精细过滤,这些表达式在扫描或查询之后修改数据;在返回结果之前。表达式使用比较运算符。它们的语法类似于条件表达式,但例外的是键属性,过滤器表达式不允许使用键属性。您不能在过滤器表达式中使用分区键或排序键。
注意 - 1MB 的限制适用于应用任何过滤之前。
吞吐量规格 - 扫描会消耗吞吐量,但是,消耗重点在于项目大小而不是返回的数据。无论您请求所有属性还是仅请求少量属性,消耗量都保持不变,使用或不使用过滤器表达式也不会影响消耗量。
分页 - DynamoDB 将结果分页,将结果划分为特定的页面。1MB 的限制适用于返回的结果,当您超过此限制时,需要进行另一次扫描才能收集其余数据。LastEvaluatedKey值允许您执行此后续扫描。只需将该值应用于ExclusiveStartkey。当LastEvaluatedKey值变为 null 时,操作已完成所有数据页面。但是,非 null 值并不一定意味着还有更多数据。只有 null 值才表示状态。
Limit 参数 - Limit 参数管理结果大小。DynamoDB 使用它来确定在返回数据之前要处理的项目数量,并且不超出范围工作。如果您设置 x 值,DynamoDB 将返回前 x 个匹配项。
Limit 参数产生部分结果的情况下,LastEvaluatedKey 值也适用。使用它来完成扫描。
结果计数 - 查询和扫描的响应还包括与ScannedCount和 Count 相关的信息,它们分别量化扫描/查询的项目和返回的项目。如果您不进行过滤,则它们的值相同。当您超过 1MB 时,计数仅代表已处理的部分。
一致性 - 查询结果和扫描结果是最终一致的读取,但是,您也可以设置强一致的读取。使用ConsistentRead参数更改此设置。
注意 - 强一致的读取设置会影响消耗,因为在设置为强一致时会使用双倍的容量单元。
性能 - 查询比扫描具有更好的性能,因为扫描会爬取整个表或二级索引,导致响应缓慢且吞吐量消耗很大。扫描最适合小型表和过滤器较少的搜索,但是,您可以通过遵守一些最佳实践来设计精简的扫描,例如避免突然加速的读取活动并利用并行扫描。
查询查找满足给定条件的特定键范围,其性能取决于它检索的数据量,而不是键的数量。操作的参数和匹配项的数量会特别影响性能。
并行扫描
扫描操作默认情况下顺序执行处理。然后它们以 1MB 的部分返回数据,这会提示应用程序获取下一部分。对于大型表和索引,这会导致长时间扫描。
此特性还意味着扫描可能并不总是能够充分利用可用的吞吐量。DynamoDB 将表数据分布在多个分区中;由于其单分区操作,扫描吞吐量仍然限制在一个分区中。
解决此问题的方法是从逻辑上将表或索引划分为多个段。然后,“工作器”并行(并发)扫描段。它使用 Segment 和TotalSegments参数来指定某些工作器扫描的段以及指定处理的段的总数量。
工作器数量
您必须试验工作器值(Segment 参数)以获得最佳应用程序性能。
注意 - 具有大量工作器的并行扫描会影响吞吐量,因为它可能会消耗所有吞吐量。使用 Limit 参数管理此问题,您可以使用它来阻止单个工作器消耗所有吞吐量。
以下是深度扫描示例。
注意 - 下面的程序可能假设存在预先创建的数据源。在尝试执行之前,请获取支持库并创建必要的数据源(具有所需特征的表或其他引用的源)。
此示例还使用 Eclipse IDE、AWS 凭证文件以及 Eclipse AWS Java 项目中的 AWS 工具包。
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<String, Object> expressionAttributeValues = new HashMap<String, Object>();
expressionAttributeValues.put(":pr", 100);
ItemCollection<ScanOutcome> 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<Item> iterator = items.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}
}
}