如何使用Dynamodb进行基本聚合?

用dynamodb如何实现聚合? Mongodb和couchbase有地图减少支持。

比方说,我们正在建立一个科技博客,用户可以发布文章。 并说文章可以被标记。

user
{
    id : 1235,
    name : "John",
    ...
}

article
{
    id : 789,
    title: "dynamodb use cases",
    author : 12345 //userid
    tags : ["dynamodb","aws","nosql","document database"]
}

在用户界面中,我们想要显示当前用户标签和相应的计数。

如何实现以下聚合?

{
    userid : 12,
    tag_stats:{
        "dynamodb" : 3,
        "nosql" : 8
    }
}

我们将通过rest api提供这些数据,并且会经常调用它。 就像这个信息显示在应用程序主页面。

  • 我可以考虑提取所有文档并在应用程序级别进行聚合。 但我觉得我的阅读能力单位将会耗尽
  • 可以使用EMR,redshift,bigquery,aws lambda等工具。 但我认为这些是用于数据存储的目的。
  • 我想知道实现这一目标的其他更好方法。 人们如何实现像这些动态简单查询,选择dynamodb作为考虑成本和响应时间的主数据存储。


    长话短说:迪纳摩不支持这一点。 它不是为这个用例而构建的。 它旨在以低延迟快速访问数据。 它根本不支持任何聚合功能。

    您有三个主要选项:

  • 将DynamoDB数据导出到Redshift或EMR Hive。 然后你可以对陈旧的数据执行SQL查询。 这种方法的好处是它只消耗一次RCU,但是你会坚持使用过时的数据。

  • 为Hive使用DynamoDB连接器并直接查询DynamoDB。 您可以再次编写任意SQL查询,但在这种情况下,它将直接访问DynamoDB中的数据。 缺点是,它会消耗每个查询的读取容量。

  • 使用DynamoDB流在单独的表中维护聚合数据。 例如,您可以将一个表UserId作为分区键,并将嵌套地图与标记和计数作为属性。 在原始数据的每个更新中,DynamoDB流将执行Lambda函数或主机上的某些代码来更新聚合表。 这是最具成本效益的方法,但您需要为每个新查询实现附加代码。

  • 当然,您可以在应用程序级别提取数据并将其聚合在那里,但我不建议这样做。 除非你有一张小桌子,否则你需要考虑限制,只使用一部分预置容量(例如,要消耗20%的RCU进行聚合,而不是100%),以及如何将工作分配给多个工作人员。

    Redshift和Hive都已经知道如何做到这一点。 Redshift在执行查询时依赖于多个工作节点,而Hive则基于Map-Reduce的顶层。 此外,Redshift和Hive都可以​​使用预定义的RCU吞吐量百分比。

    链接地址: http://www.djcxy.com/p/96311.html

    上一篇: How to do basic aggregation with Dynamodb?

    下一篇: RTMP streaming through http