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

如何在DynamoDB中查询datetime大于X的记录?

国景铄
2023-03-14

我在DynamoDB中有一个表,我需要得到一个记录列表(Java),这些记录是从最后一天开始的。它们都有dateTime属性。

我所指的表的相关属性:customerUrl(string,hashkey)、dateTime(number,range key)和其他一些不相关的属性

我已经尝试过用dateTime的hashkey设置一个全局二级索引,但没有范围键。此索引名为“performanceIndex”。然后,我尝试按如下方式对其进行查询:

Map<String, AttributeValue> eav = new HashMap<>();
eav.put(":val1", new AttributeValue().withN(maximumAgeMillis));
DynamoDBQueryExpression<PingLog> pinglogQuery = new DynamoDBQueryExpression<PingLog>();
pinglogQuery.setKeyConditionExpression("dateTime > :val1");
pinglogQuery.setExpressionAttributeValues(eav);
pinglogQuery.setIndexName("performanceIndex");
pinglogQuery.setConsistentRead(false);
List<PingLog> pinglogs = PostDatabaseMapper.getInstance().query(PingLog.class, pinglogQuery);

但是,查询将永久地继续进行,并且永远不会返回。我在它前后添加了一个println语句,只有第一个语句被实际打印出来。

在这个查询之前,我只是用一个过滤器进行了一次扫描,这很有效,但现在我们有这么多记录(8000万条),所以扫描需要永远的时间。我该怎么办?我需要不同的二级索引吗?我的问题错了吗?

共有1个答案

李和裕
2023-03-14

您应该创建一个GSI,其中yyyy-mm-dd作为分区键,hh: mm: ss作为排序键。(这可能需要回填整个表,但如果您经常按日期查询,这将是值得的。)查看一个相关问题的答案,其中有关于这种方法的更多细节。

根据您所使用的数据访问模式的类型,可能会出现复杂情况。它是相当稳定的,还是剧烈的?当前项目的写入吞吐量是否比其他任何一天都要高得多?

如果您正在处理时间序列数据,如物联网传感器读数,此策略可能不适用于您。您的GSI中可能有一个热分区,这可能会在主表中产生反压力,并导致写操作受到限制。这是不可能的,因为DynamoDB的适应能力,但这是可能的。

在这种情况下,您应该考虑MadioDB推荐的处理时间序列数据的最佳实践。它讨论了如何处理随时间推移具有不同访问要求的数据。他们解决方案的要点是为每个时段(天/月/年/任何时间段)创建单独的表,以便来自不同时间段的数据可以具有不同的配置容量。

 类似资料:
  • 我有一个dynamodb表,它的字符串主键名为,数字排序键名为。我想获取dynamodb表中年龄

  • 我不了解DynamoDb中查询/扫描限制的概念。根据文件: 单个查询操作最多可以检索1 MB的数据。在对结果应用任何FilterExpression之前,此限制适用。 假设我有10k个条目,每个条目250kb,所有条目都符合查询参数。 如果我运行一个简单的查询,我只得到4个项目?

  • 在我的DynamoDB表中,有HashKey=ID和GSI=Type。我需要获取特定类型(GSI)的所有hashKeys(ID)。 在这种情况下,获取给定类型的所有ID的有效方法是什么?我的DynamoDB表不会很大。

  • 问题内容: 我正在尝试查询DynamoDB表以查找未设置属性的所有项目。包含该字段的表上存在一个称为的全局二级索引。 结果: 表定义: 问题答案: DynamoDB的全局二级索引允许稀疏索引。这意味着,如果您有一个GSI,但未定义该项目的哈希或范围键,则该项目将不会直接包含在GSI中。这在许多用例中很有用,因为它使您可以直接识别包含某些字段的记录。但是,如果您缺少字段,则此方法将行不通。 要获取所

  • 我有一个DynamoDB表,其中有一个字母数字字符串作为哈希键(例如“D4ED6962-3EC2-4312-A480-96ECBB48C9DA”)。我需要根据表中的另一个字段查询该表,因此我需要我的查询选择所有键,例如我的字段x在dat x和date y之间。 我知道我需要在哈希键上设置一个条件,在范围键上设置另一个条件,但是我很难编写一个不将查询绑定到特定ID的哈希键条件。 我以为我可以使用一个

  • 根据此链接: DynamoDB上支持的操作 “只能查询具有复合主键(分区键和排序键)的表。” 但这似乎并不正确。我在DynamoDB中有一个名为“users”的表,该表的主键只包含一个属性“username”。 而且我能够在NodeJS中仅使用“username”属性上的“KeyConditionExpression”查询该表。请参见以下内容: } 这段代码运行得很好。所以我想知道文档是否有误,或