当前位置: 首页 > 知识库问答 >
问题:

如何将Dynamodb扫描限制为给定的分区键并且不读取整个表

姜煌
2023-03-14

具有数十亿条目的理论表。

分区键是表示给定设备ID的唯一uuid。大约会有10k唯一的uuid。

排序键是数据收集时间的日期字符串。

每个项目都有一些数据字段。有几十个字段,因此为每个字段制作GSI是不合理的。对于我们的示例,假设我们正在寻找“dataOfinterest”字段。

我想在数据库中搜索“dataOfinterest='fobar'的所有项目”——理想情况下是在日期范围内进行。据我所知,扫描操作是唯一的选择。有数十亿个条目......这不会是一个快速的过程(尽管我知道我可以将其拆分出来一次运行多个操作——它仍然会疯狂地吃掉RCU)

然而,需要注意的是,我只关心每个搜索的给定uuid。换句话说,我真正关心的是“给定分区内的所有项,其中dataOfInterest='foobar'。此外,最好使用排序键给出“给定分区内的所有项目,其中dataOfInterest='foobar'介于1月1日和2月28日之间”

扫描操作允许您使用筛选器表达式限制结果,这样我就可以只获得单个分区的结果。。。但它仍然读取整个表,并在将数据返回给您之前完成过滤。https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html

是否有一个AWS API可以执行只读取给定分区的类似扫描的操作?是否有其他方法来实现这一点(可能是重新设计数据库?)

共有1个答案

梁韬
2023-03-14

正如@jarmod所说,您可以使用Query并指定UUID的PK。然后,您可以将时间戳放入SK并过滤dataOfinterest值(未索引),或者为了提高效率并使所有内容都被索引,您可以构建一个复合SK,它是dataOfinterest#time戳,然后对fobar#time1fobar#time2的SK进行范围查询。这使得此查询完美地优化了索引。

当然,这使得纯粹基于时间戳的查询变得不那么简单。因此,您可以对这些查询执行多个查询,或者如果希望两个查询都有效,可以在GSI中设置此组合SK并使用它来解析此查询。

 类似资料:
  • 当我扫描一个表(包括所有字段)时,DynamoDB限制为1000,每次扫描大约480个项目,因为每个项目都足够大,DynamoDB会根据1MB大小限制截断响应。 然而,当我扫描同一个表,并使用ProjectionExpression只请求主键字段时,我仍然只得到大约480个项目,这表明DynamoDB不必要地从每个项目加载完整数据,只会丢弃主键以外的数据,而不是直接从主索引中提取键。 如何只扫描主

  • 我在用node.js. 如果你看这个例子: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Scan.html 上面写着: 其中限制结果项的数量: 通常,AWS CLI自动处理分页;然而,在本例中,CLI的--page size参数限制了每页的项目数。 但如果您读取节点。js AWS文件: https://docs.

  • 假设我有一个带有分区键“ID”和范围键“Time”的表,其中包含以下项目: 我只想扫描每个分区中时间值最高的一个项目。所以扫描的结果应该如下所示: DynamoDB的扫描功能是否可能做到这一点?(我想避免全部扫描,自己过滤)。

  • 我有一个dynamodb表,用于存储在我的服务器上运行的进程的历史运行数据,我需要一个可以聚合这些进程并查看每个进程的最新数据的位置。每个进程都有自己的ProcessId,它是dynamodb表的分区键。排序键是开始时间 本质上,我需要为我提供的每个ProcessId检索最新的StartDateTime。我在aws sdk中使用nodejs lambda来检索数据。我已经研究过使用BatchGet

  • 我有一个DynamoDB表,如下所示: 是表的简单主键 是一个属性,它对表中的所有项目都具有相同的值 桌子变得很大了。我希望能够根据日期时间按范围过滤数据。我脑海中有两个快速实施的选项,但我不确定这是否会在成本方面产生很大的影响。 扫描整个表,然后按日期时间过滤(因为dynamodb不允许在扫描之前过滤) 所以,我的问题是,由于我的分区键对每个项目都是相同的,因此是一个大分区,我不确定当使用过滤器

  • 正如使用boto3完全扫描dynamoDb中所解释的,我构建了一个解决方案,使用某些条件完全扫描dynamoDb表。这是我的代码: 但是当代码被执行时,它会进入一个无限循环。这是LastEvaluatedKey每次迭代的输出: 它一直在这两对之间循环。 编辑: 我添加了do_scan方法。