如何在仅一个查询中使用扫描来检索数据以在dynamoDB中构建直方图

时间:2018-07-04 23:03:45

标签: amazon-dynamodb aws-cli

我正在尝试在我的dynamodb中建立特定属性的直方图。
我可以通过运行多个scan count查询并每次更改范围

来获取所有值。
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吗?

2 个答案:

答案 0 :(得分:1)

简短的答案是-您无法一次扫描。

要对此进行扩展,可以通过两种方法来实现所需的目标:

1)一次扫描一次扫描最多返回1MB的数据(请参阅per-api limits section in the docs),因此从一般意义上讲,您将需要一系列的Scan调用才能从表中读取所有数据

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

因此,您必须做的是运行没有任何过滤器的扫描,然后在应用程序中实现分组和聚合。本质上,这是一种映射/归约操作:将基于得分的项目映射到存储桶中,并使用计数进行减少以生成直方图。

答案 1 :(得分:1)

正如Mike指出的那样,DynamoDB不支持聚合查询。
但是,有一个宝贵的提示:MapReduce

  1. 创建一个Amazon集群,将其SSH到其中
  2. 将dynamoDB表映射到配置单元表
  3. 增加您的dynamodb表的读取容量(我的表有300M项,因此我将读取容量提高到4000)
  4. 使用配置单元运行mapReduce查询:
    hive> select score, count(score) from (select score from hive_my_table limit 300000000) as t1 GROUP by score;
    我的查询需要2054秒才能运行。
    我得到了分数及其实例个数(因此是完整的直方图)

提示:不要害怕增加读取容量,您将节省群集运行时。使用100的读取容量,我计算出查询将需要一天的时间才能完成。