【问题标题】:DynamoDB counter field statistics only per last N days仅过去 N 天的 DynamoDB 计数器字段统计信息
【发布时间】:2019-08-01 06:14:39
【问题描述】:

我有一个 DynamoDB 表,其中包含两个字段:entityID(哈希键)和 clickedCounter。 clickedCounter 是一个自动递增的计数器,用于计算用户单击 entityID 的次数,我将 clickedCounter 标记为 DynamoDB 版本属性(带有 java 注释 DynamoDBVersionAttribute)。 有了这样的表,我可以轻松地获得每个 entityID 一直被点击的次数的统计信息,但我需要仅在过去 N 天获得汇总统计数据(例如,每过去 7 天)。我该如何存档?

作为一个潜在的解决方案,我可以再添加两个字段:expiredTime(实际上是一个生存时间属性,所以旧数据会自动删除)和 dayOfYear。这里 dayOfYear 是哈希键,entityID 是范围键。例如,对于 1 月 10 日,应用程序将仅存储最近 3 天的 entityID 等于 1005 的以下数据(并且前几天的数据将被 TTL 管理器删除):

 dayOfYear   entityID  clickedCounter  expiredTime 
 10          1005      9                …
 9           1005      10               …                     
 8           1005      19               …                 
 7           1005      12               …                 

为了获得上面例子的统计信息,我应该通过散列和范围键对(在这个例子中,通过对 , , , ) 并对所有 clickedCounter 值求和(这里的总和为 50)。

是否可以以更简单、更正确的方式仅获取最近 N 天的汇总统计信息?

【问题讨论】:

标签: java amazon-web-services amazon-dynamodb


【解决方案1】:

DynamoDB 旨在提供大规模的快速查找,而不是作为分析数据库。分析查询最好使用分析工具。您可能能够为此类聚合创建更好的计数器,但随后您希望进行其他计算,例如平均或不同的时间窗口,而您的计数器将无用。

我将使用 DynamoDB stream 捕获对 DynamoDB 表的更改,并将这些更改记录到分析数据存储中,例如 Redshift 或简单地记录到 S3 中(例如,使用 Kinesis Firehose)。在该分析数据存储中获得该日志更改后,您可以对其运行灵活的查询。例如,您可以使用Athena(或任何其他 S3 上的 SQL 工具)在 S3 中查询您的数据。

【讨论】:

    【解决方案2】:

    DynamoDB 不支持分析查询。一种方法是使用与EMR HiveRedshift 的集成。您可以将数据从 DynamoDB 导出到其中一个系统并在此快照上执行查询,或者使用 EMR Hive,您可以对 DynamoDB 数据运行查询。在任何情况下,您都可以对您的数据运行任意 SQL 查询。

    请记住,无论您使用什么工具,它都会读取表中的所有数据,因此它要么很昂贵(您需要预置大量 RCU/WCU),要么很慢,因此您将无法以交互方式运行这些查询。

    另一个选项,正如@Guy 建议的那样,是使用 DynamoDB 流和 Lambda 维护一个聚合表。这会运行得更快,也更便宜,但它的灵活性要低得多,因为您最终可能会为需要进行的每个查询维护一个单独的表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2021-11-01
      相关资源
      最近更新 更多