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

在DynamoDB中按排序键索引?

晋越彬
2023-03-14

我有一个DynamoDB表,我正在聚合CDN访问日志。具体来说,我想跟踪:

对于一个给定的客户(所有客户的请求都可以从正在下载的URL中识别出来),每天代表他们发送了多少字节?

我在客户上有一个主分区键,在time_bucket(天)上有一一个主排序键。例如,对于一个客户,我可以说“查找从2021 3月1日到2021 3月31日的所有记录”。到目前为止,一切都很好

当我想开始删除旧数据时,问题就出现了。任何超过5年的数据都应该从数据库中删除。

因为分区键不在< code>time_bucket上,所以没有简单的方法来说“检索2016年5月25日的所有记录”。这样做需要扫描而不是查询,扫描是不可能的(考虑到我要处理的数据量,扫描速度慢得不可思议)

我不想交换分区键和排序键,原因有两个:

  • 当处理要添加到Dynamo表的新数据时,所有新CDN日志都将在同一天。这意味着我的表将不平衡:在一天内进行的每一次写入操作都将命中同一个分区键
  • 如果我想为一个客户提取一个月的数据,我必须进行30次查询,每个月每天一次。当提取一年或三年的数据时,情况更糟

我的第一个想法是在time_bucket列上添加一个索引,但当我尝试时,我得到了一个错误:

属性名称重复:time_bucket(服务:Amazon DynamoDBv2;状态代码:400;错误代码:ValidationException;请求ID:PAN9FVSEMBBJT412NCV013VURNVV4KQNSO5AEMVJF66Q9ASUAAJG;代理:空)

似乎DynamoDB不允许您在排序键上创建索引。那么,这里的正确解决方案是什么?

共有2个答案

白志勇
2023-03-14

DynamoDB是一个NoSQL数据库,允许快速查找操作,而不是分析操作,如提取整个月的数据。你也许可以这样或那样做,但你不应该这样做。将您的记录从DDB复制到S3(使用DynamoDB Streams和Kinesis Firehose作为无服务器选项),然后使用Amazon Athena查询数据。您将获得一个丰富的分析性SQL接口,它的成本非常低并且可伸缩。你不需要无缘无故删除旧数据。它还会降低DynamoDB的成本,因为您可以只在那里存储查找所需的数据,例如30天。

芮立果
2023-03-14

处理这个问题的正确方法是,当你把记录放在DDB时,简单地设置一个5年的TTL。

不仅会自动删除记录,而且删除是免费的。没有WCU被消耗。

您现在可以添加 TTL,但您必须组合一个小实用程序来向现有记录添加过期时间属性。

如果您想手动执行此操作,则需要添加全局二级索引(GSI)。您可以使用现有的时间桶作为GSI哈希键来执行此操作。然后您需要Query(GSI, hk='2016-05-01')来查找每个记录和DeleteItem()。

请注意,GSI有自己的成本,您将支付读取GSI并从表中删除的费用。

 类似资料:
  • 我有一个带有分区键(UUID)的DynamoDB表,其中有几个属性(如名称、电子邮件、创建日期等)。创建日期是项目中的一个属性,其格式为YYYY-MM-DD。但现在有一个要求更改-我必须根据创建日期对其进行排序,并提供整个数据(也就是说,我不能只将数据放在某个特定分区上,而是以排序方式将所有分区中的所有数据都放在一起。我知道这可能需要DynamoDB花费时间从所有分区中提取数据并在之后进行排序。我

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

  • 我如何对键上的elasticsearch聚合桶进行排序。我有嵌套的聚合,想对我的第二个聚合桶结果进行排序。 就像我有: 我希望我的< code >事件聚集桶在关键< code >印象或< code >页面视图上按desc/asc排序。我如何实现这样的结果集? 这是我的查询 我试过使用_key,但它在桶内排序。我想通过查看所有桶来排序。就像我有一个键。我希望我的桶结果用这个键排序。不在桶内。 我希望

  • 我有一个倒排索引。它由我的单词词典和出现术语的文档发布列表组成。我只想按字母顺序对我的词典进行排序。这是它现在的样子(示例): ...等等,这就是排序后的样子: 我尝试的内容: 第一次打印调用提供了一个完美的单词排序列表,但如果我尝试获取单词“all”的已连接帖子列表,我会收到以下错误消息:

  • 我有一个带有主键和排序键的表;因为这是一个复合键,所以我有多个主键与不同的排序键映射。 如何获取与特定主键关联的所有排序键? 我尝试使用“Get”操作,但这似乎也需要排序键(尽管我正在寻找这些键)。我还研究了“BatchGet”操作,但这是针对多个不同的键,而不是针对具有多个不同排序键的单个主键。 我也尝试过“查询”,但没有成功,但我对这一点了解较少,所以这可能就是解决方案——是这样吗?我还知道,

  • 我试图使用batchGetItem从表中返回多个项的属性,但似乎它只适用于分区键和范围键的组合,但是如果我只想通过主键识别请求的项,该怎么办?唯一的方法是创建不带范围键的表吗? 根据官方留档: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.Partitions.html 如果表有一个复合主键(分

  • 我有一个DynamoDB表,其中包含主键:userID、排序键:sesionID和另一列,该列名为示例ID。 我想返回一个列表,该列表返回所有包含我发送的userID和examID的记录。这是我的代码: 这就是我得到的错误:{“statusCode”:500,“body”:“{”error“:“查询条件缺少关键架构元素:sessionId”}”, ... 我想也许我应该包括一个过滤器表达式,或者不

  • 假设我已经在一个表上有分区键,并且我正在添加一个全局二级索引。如果没有排序键,创建这个GSI有什么意义呢?我对GSI读得越多,AWS似乎就越强调GSI在指定自己的分区键和排序键方面的灵活性。我不太确定在不指定排序键的情况下添加GSI的用途。