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

2024-01-25

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 作为主要数据存储。


长话短说:Dynamo 不支持这一点。它不是为此用例构建的。它旨在实现低延迟的快速数据访问。它根本不支持任何聚合功能。

您有三个主要选择:

  • 将 DynamoDB 数据导出到Redshift http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/RedshiftforDynamoDB.html or EMR Hive http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/EMRforDynamoDB.Tutorial.html。然后您可以对陈旧数据执行 SQL 查询。这种方法的好处是它只消耗 RCU 一次,但您将坚持使用过时的数据。

  • Use DynamoDB 连接器 https://github.com/awslabs/emr-dynamodb-connector对于 Hive 并直接查询 DynamoDB。同样,您可以编写任意 SQL 查询,但在这种情况下它将直接访问 DynamoDB 中的数据。缺点是它会消耗您执行的每个查询的读取容量。

  • 使用以下方法在单独的表中维护聚合数据DynamoDB 流 http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html。例如,您可以将表 UserId 作为分区键,将带有标签和计数的嵌套映射作为属性。每次更新原始数据时,DynamoDB 流都会在主机上执行 Lambda 函数或某些代码来更新聚合表。这是最具成本效益的方法,但您需要为每个新查询实现额外的代码。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 DynamoDB 进行基本聚合? 的相关文章

随机推荐