Amazon dynamodb 如何在dynamoDB中检索数据,在一次查询中使用scan构建直方图

Amazon dynamodb 如何在dynamoDB中检索数据,在一次查询中使用scan构建直方图,amazon-dynamodb,aws-cli,Amazon Dynamodb,Aws Cli,我试图在我的dynamodb中建立一个特定属性的直方图。 我可以通过运行多个扫描计数查询并每次更改范围来获得所有值 aws dynamodb scan --table-name test --select "COUNT" \ --filter-expression "(score between :s and :s1)" \ --expression-attribute-values '{ ":s": { "N": "0" }, ":s1": { "N": "10" } }' 我的问题是:

我试图在我的dynamodb中建立一个特定属性的直方图。 我可以通过运行多个扫描计数查询并每次更改范围来获得所有值

aws dynamodb scan --table-name test --select "COUNT"  \
--filter-expression "(score between :s and :s1)"  \
--expression-attribute-values '{ ":s": { "N": "0" }, ":s1": { "N": "10" } }'
我的问题是:我能在一次扫描中完成这一切吗,得到0-9,10-19。。。90-100 ?

简短的回答是否定的——你不能用一次扫描就做到

要扩展这一点,有两个阻碍因素可以实现您的目标:

1扫描每次调用最多返回1MB的数据。因此,在一般意义上,您需要一系列扫描调用来读取表中的所有数据

2 DynamoDB不支持聚合查询,这正是您真正需要的。这意味着,您不能要求它为您将数据分组到存储桶中,也不能要求它为您提供计数或项目总数


因此,您必须在不使用任何筛选器的情况下运行扫描,然后在应用程序中实现分组和聚合。这本质上是一个映射/缩减操作:根据分数将项目映射到bucket中,并使用计数生成直方图进行缩减。

正如Mike指出的,DynamoDB不支持聚合查询。 但是有一个很有价值的提示:MapReduce

创建一个Amazon集群,并将ssh插入其中 将dynamoDB表映射到配置单元表 增加dynamodb表的读取容量我的表有3亿项,所以我将读取容量增加到了4000项 使用配置单元运行mapReduce查询: 蜂巢>选择分数,从蜂巢中选择分数的countscore\u my\u表限制300000000作为t1分组分数; 我的查询运行了2054秒。 我得到了一个分数和它的实例数,所以一个完整的柱状图
提示:不要害怕增加您的读取容量,您将在集群运行时保存。读取容量为100时,我计算出查询需要一天才能完成。

太棒了!是的,带有DynamoDB连接器的蜂箱工作得很好,安装起来也不难。但是,我要提醒您,不要将配置的读取容量增加太多,因为这将导致表拆分,并且您可能会在以后支付拆分的代价。找到一个不需要太长时间就能执行的中间解决方案最有意义。如果您不需要经常运行分析查询,那么让它运行几个小时并不可怕。