如何在Amazon Dynamodb中使用聚合函数

时间:2016-04-26 13:48:41

标签: node.js amazon-dynamodb

我是Dynamodb的新手我在DynamoDB中有一个表,其中包含超过10万个项目。此外,此表经常刷新。在这张桌子上,我希望能够在关系数据库世界中做类似的事情:我如何从表中获得最大值。

3 个答案:

答案 0 :(得分:21)

DynamoDB是一个NoSQL数据库,因此对查询数据的方式非常有限。通过直接调用DynamoDB API,无法从表中执行聚合(如max value)。您将不得不寻找不同的工具和方法来解决这个问题。

您可以考虑许多可能的解决方案:

执行表格扫描

你的桌子上有超过10万件物品,这可能是一个非常糟糕的主意。表扫描将读取每个项目,您可以让应用程序端逻辑识别最大值。这真的不是一个可行的解决方案。

DynamoDB中的物化指数

根据您的使用情况,您可以使用DynamoDB流和Lambda函数在单独的DynamoDB表中维护索引。如果您的表是只写的,没有更新,也没有删除,您可以将最大值存储在单独的表中,并且当插入新记录时,您可以比较它们并执行必要的更新。

这种方法在某些受限制的情况下是可行的,但不是一般化的解决方案。

使用Amazon Redshift执行分析

DynamoDB并不意味着进行最大化等分析操作,而Redshift是一个非常强大的大数据平台,可以轻松执行这些类型的计算。与DynamoDB索引类似,您可以使用DynamoDB流将数据发送到Redshift,因为记录被插入以维护表的近实时副本以用于分析目的。

如果您正在寻找更多离线或分析解决方案,这是一个不错的选择。

使用Elasticsearch执行Google Analytics

虽然DynamoDB是一个功能强大的NoSQL解决方案,对数据持久性有很强的保证,但Elasticsearch提供了一种非常灵活的查询方法,允许对最大和这些聚合等查询实时切片和切块任何属性值。与上述解决方案类似,您可以使用DynamoDB流实时将记录插入更新和删除发送到Elasticsearch索引。

如果您想坚持使用DynamoDB但需要一些额外的查询功能,这确实是一个不错的选择,尤其是在使用AWS ES服务时,它将为您完全管理Elasticsearch集群。重要的是要记住,Elasticsearch不会替换您的DynamoDB表,它只是一个易于搜索的相同数据索引。

只需使用SQL数据库

显而易见的解决方案是,如果您有SQL要求,那么从基于NoSQL的系统转移到基于SQL的系统。 AWS的RDS产品提供托管解决方案。虽然DynamoDB提供了很多好处,但如果您的用例将您带入SQL解决方案,那么最简单的方法就是不要对抗它而只是改变解决方案。

这并不是说基于SQL的解决方案或基于NoSQL的解决方案更好,每种解决方案都有优缺点,并且根据具体的使用情况而有所不同,但它绝对是一个需要考虑的选项。

答案 1 :(得分:0)

答案 2 :(得分:-1)

根据Jared在此处https://stackoverflow.com/a/36877999/6723229的回答,有两种其他方法可以在AWS DynamoDB上执行聚合,但需要将数据导出到其他服务。

使用S3 +雅典娜执行分析:

将数据从DynamoDB加载到Amazon S3,然后使用Amazon Athena之类的服务在其上运行查询。您可以使用AWS Glue执行ETL过程,并在S3中创建DynamoDB表的完整副本。该方法的主要缺点是无法实时或接近实时地查询数据。转储DynamoDB的所有内容可能需要花费几分钟,然后才能运行分析查询。

使用Rockset执行分析:

Rockset是用于搜索和分析的完全托管的服务。 Rockset与DynamoDB进行了实时集成,可用于使DynamoDB和Rockset之间的数据保持同步。 Rockset构建多个索引,并允许您使用完整的SQL对大量数据进行毫秒延迟聚合。 请参阅此处以了解如何进行设置:https://rockset.com/blog/running-fast-sql-on-dynamodb-tables/

披露:我在工程团队@Rockset上工作。