DynamoDB计数器字段统计信息仅在过去N天内

时间:2017-07-20 20:22:40

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

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

作为一种潜在的解决方案,我可以再添加两个字段:expiredTime(实际上是生存时间属性,因此旧数据将自动删除)和dayOfYear。这里dayOfYear是散列键,entityID是范围键。例如,对于1月10日,app将仅在过去3天内将entityID的以下数据存储为1005(前一天的数据将被TTL管理员删除):

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

为了得到上面的例子的统计数据,我应该通过散列和范围密钥对来加载请求(在这个例子中,通过成对< 10,1005>,< 9,1005>,< 8,1005>,< ; 7,1005>)并将所有clickedCounter值相加(此处总和为50)。

是否有可能以更简单,更正确的方式在过去N天内获得汇总统计信息?

2 个答案:

答案 0 :(得分:0)

DynamoDB旨在提供大规模的快速查找,而不是分析数据库。最好使用分析工具进行分析查询。您可能能够为这样的聚合创建更好的计数器,但是您希望进行另一个计算,例如平均值或不同的时间窗口,并且您的计数器对它没有用处。

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

答案 1 :(得分:0)

DynamoDB对分析查询没有本机支持。但实现此目的的一种方法是使用与EMR HiveRedshift的集成。您可以将DynamoDB中的数据导出到这些系统之一并对此快照执行查询,或者使用EMR Hive可以对DynamoDB数据运行查询。在任何情况下,您都可以对数据运行任意SQL查询。

请记住,无论您使用什么工具,它都会读取您表格中的所有数据,因此它要么昂贵(您需要提供大量的RCU / WCU)或者速度慢,所以您不会能够以交互方式运行这些查询。

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