DynamoDB教程

DynamoDB 扫描

扫描操作读取所有表项或二级索引。它的默认函数导致返回索引或表中所有项目的所有数据属性。在过滤属性中使用 ProjectionExpression 参数。
每次扫描都会返回一个结果集,即使没有找到匹配项,也会导致一个空集。扫描检索不超过 1MB,可选择过滤数据。
注意-扫描的参数和过滤也适用于查询。

扫描操作的类型

过滤-扫描操作通过过滤器表达式提供精细过滤,在扫描或查询后修改数据;在返回结果之前。表达式使用比较运算符。它们的语法类似于条件表达式,但关键属性除外,过滤表达式不允许。您不能在过滤器表达式中使用分区或排序键。
注意-1MB 限制适用于任何过滤应用之前。
吞吐量规格-扫描消耗吞吐量,但是,消耗侧重于项目大小而不是返回的数据。无论您请求每个属性还是仅请求几个属性,消耗量都保持不变,使用或不使用过滤器表达式也不会影响消耗量。
分页-DynamoDB 对结果进行分页,导致将结果划分为特定页面。 1MB 限制适用于返回的结果,当您超过该限制时,需要再次扫描以收集其余数据。 LastEvaluatedKey 值允许您执行此后续扫描。只需将该值应用于 ExclusiveStartkey。当 LastEvaluatedKey 值变为 null 时,操作已完成所有数据页。但是,非空值并不自动意味着还有更多数据。只有空值表示状态。
限制参数-限制参数管理结果大小。 DynamoDB 使用它来确定返回数据之前要处理的项目数,并且不在范围之外工作。如果您将值设置为 x,DynamoDB 将返回前 x 个匹配项。
LastEvaluatedKey 值也适用于产生部分结果的限制参数的情况。用它来完成扫描。
Result Count-对查询和扫描的响应还包括与 ScannedCount 和 Count 相关的信息,它们量化扫描/查询的项目并量化返回的项目。如果不过滤,它们的值是相同的。当您超过 1MB 时,计数仅代表已处理的部分。
一致性-查询结果和扫描结果是最终一致性读取,但是,您也可以设置强一致性读取。使用 ConsistentRead 参数更改此设置。
注意-一致的读取设置在设置为强一致时使用两倍的容量单位会影响消耗。
性能-由于扫描会抓取全表或二级索引,查询提供比扫描更好的性能,从而导致响应缓慢和吞吐量消耗大。扫描最适合使用较少过滤器的小表和搜索,但是,您可以通过遵循一些最佳实践来设计精益扫描,例如避免突然加速的读取活动和利用并行扫描。
查询会找到满足给定条件的特定范围的键,其性能取决于它检索的数据量而不是键的数量。操作的参数和匹配的数量会特别影响性能。

并行扫描

扫描操作默认按顺序执行处理。然后它们以 1MB 的部分返回数据,这会提示应用程序获取下一部分。这会导致对大型表和索引的长时间扫描。
这个特性也意味着扫描可能并不总是充分利用可用的吞吐量。 DynamoDB 跨多个分区分布表数据;由于其单分区操作,扫描吞吐量仍然仅限于单个分区。
此问题的解决方案来自将表或索引逻辑地划分为段。然后"workers"并行(并发)扫描segment。它使用Segment和 TotalSegments的参数来指定特定worker扫描的segment,并指定处理的segment总数。

工人编号

您必须尝试使用​​工作器值(Segment 参数)才能获得最佳应用程序性能。
注意-大量工作人员的并行扫描可能会消耗所有吞吐量,从而影响吞吐量。使用限制参数管理此问题,您可以使用该参数阻止单个工作线程消耗所有吞吐量。
以下是深度扫描示例。
注意-以下程序可能假设一个先前创建的数据源。在尝试执行之前,获取支持库并创建必要的数据源(具有所需特征的表或其他参考源)。
此示例还使用 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()); 
      }     
   } 
}
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4