如何连接 AWS DynamoDB 中的表?

How to join tables in AWS DynamoDB?

我知道整个设计应该基于自然聚合(文档),但是我正在考虑为本地化(语言、键、文本)实现一个单独的 table,然后在其他 table秒。但是,我找不到任何这样做的例子。

任何指点都可能有帮助!

你是对的,DynamoDB 不是作为关系型数据库设计的,不支持连接操作。您可以将 DynamoDB 视为一组键值对。

您可以在多个 table 中使用相同的键(例如 document_IDs),但 DynamoDB 不会自动同步它们或具有任何外键功能。一个 table 中的 document_IDs 虽然名称相同,但在技术上与另一个 table 中的 document_IDs 是不同的集合。由您的应用程序软件来确保同步这些密钥。

DynamoDB 是一种不同的数据库思考方式,您可能需要考虑使用托管关系数据库,例如 Amazon Aurora:https://aws.amazon.com/rds/aurora/

需要注意的一点是,Amazon EMR 确实允许加入 DynamoDB tables,但我不确定这是否是您要查找的内容:http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/EMRforDynamoDB.html

使用 DynamoDB,而不是加入我认为最好的解决方案是以您稍后打算读取的形式存储数据。

如果您发现自己需要复杂的读取查询,您可能已经陷入了期望 DynamoDB 的行为像 RDBMS 的陷阱,但事实并非如此。转换和塑造您写入的数据,保持读取简单。

现在磁盘比计算便宜得多 - 不要害怕去规范化。

您必须查询第一个 table,然后在下一个 table 上使用 get 请求遍历每个项目。

其他答案并不令人满意,因为 1) 不回答问题,更重要的是,2) 您如何设计您的 table 以提前了解它们的未来应用?技术债务太高,无法合理地覆盖无限的未来可能性。

我的回答效率低得可怕,但这是当前对所提出问题的唯一解决方案。

我热切期待更好的答案。

我知道我的回复有点晚了,几年了。但是,我能够挖掘出一些关于 Amazon DynamoDB & Joins 的额外信息,这可能会让您受益(或者也许是其他人,他们可能在将来研究这些信息时偶然发现这个讨论)。

为了切入正题,我在 Amazon DynamoDB 网站上找到了一些文档,其中指出可以使用 Apache HiveQL 查询语言对 Amazon DynamoDB 表、列和数据等执行连接。

在 DynamoDB 中查询数据(使用 HiveQL): https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/EMRforDynamoDB.Querying.html

使用 Amazon DynamoDB 和 Apache Hive: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/EMRforDynamoDB.Tutorial.html

使用 Amazon EMR 上的 Apache Hive 处理 Amazon DynamoDB 数据: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/EMRforDynamoDB.html

我希望这些信息能帮助到一些人,即使不是最初的发帖者。

最近我有同样的要求使用 dynamoDb 的连接和聚合函数,如 avg 和 sum,为了解决这个问题,我使用了 Cdata JDBC 驱动程序并且它工作得很好。它支持连接以及聚合功能。虽然,由于 Cdata 的许可成本,我也在寻找避免使用 cdata 的解决方案。

更新:这个答案完全符合定义的社区准则,而不是仅谈论商业解决方案的非答案。


我在这个 space 中多次看到一个解决方案是从 DynamoDB 同步到一个单独的数据库,该数据库更适合您正在寻找的操作类型。

我写了一篇关于这个主题的 blog 文章,比较了我见过的人们解决这个问题的各种方法,但我将在这里总结一些关键要点,这样你就不必阅读所有内容

DynamoDB 二级索引

有什么好?

  1. 速度快,不需要其他系统!
  2. 适用于您正在构建的非常具体的分析功能(如排行榜)

注意事项

  1. 二级索引数量有限,查询保真度有限
  2. 如果你依赖扫描的话会很贵
  3. 直接使用生产数据库进行分析的安全性和性能问题

DynamoDB + Glue + S3 + Athena

有什么好?

  1. 所有组件都是“无服务器”的,不需要提供基础设施
  2. 易于自动化 ETL 管道

注意事项

  1. 几个小时的高端到端数据延迟,这意味着陈旧的数据
  2. 查询延迟从几十秒到几分钟不等
  3. 架构实施可能会丢失混合类型的信息
  4. 如果源中的数据结构发生变化,ETL 过程可能需要不时维护

DynamoDB + Hive/Spark

有什么好?

  1. 查询DynamoDB最新数据
  2. 除了指定架构外不需要 ETL/pre-processing

注意事项

  1. 当字段具有混合类型时,架构实施可能会丢失信息
  2. EMR 集群需要一些管理和基础设施管理
  3. 查询最新数据需要扫描,费用高
  4. 直接在 Hive/Spark
  5. 上的查询延迟从几十秒到几分钟不等
  6. 运行 分析查询对操作数据库的安全和性能影响

DynamoDB + AWS Lambda + Elasticsearch

有什么好?

  1. 全文搜索支持
  2. 支持多种类型的分析查询
  3. 可以处理 DynamoDB 中的最新数据

注意事项

  1. 需要管理和监控用于摄取、索引、复制和分片的基础设施
  2. 需要单独的系统来确保 DynamoDB 和 Elasticsearch 之间的数据完整性和一致性
  3. 扩展是手动的,需要配置额外的基础设施和操作
  4. 不支持不同索引之间的连接

DynamoDB + Rockset

有什么好?

  1. 完全无服务器。无需操作或配置基础设施或数据库
  2. DynamoDB 和 Rockset 集合之间的实时同步,因此它们之间的间隔绝不会超过几秒
  3. 监控以确保 DynamoDB 和 Rockset 之间的一致性
  4. 基于数据构建的自动索引支持低延迟查询
  5. SQL 可以扩展到高 QPS 的查询服务
  6. 加入来自其他来源的数据,例如 Amazon Kinesis、Apache Kafka、Amazon S3 等
  7. 通过 REST 和使用客户端库与 Tableau、Redash、Superset 和 SQL API 等工具集成。
  8. 包括全文搜索、摄取转换、保留、加密和细粒度访问控制在内的功能

注意事项

  1. 不太适合存储很少查询的数据(如机器日志)
  2. 不是事务数据存储

(完全披露:我在产品团队工作@Rockset) 查看 blog 了解有关各个方法的更多详细信息。

当我需要这样做时,我使用了 python 中的 pandas 在内存中跨表进行连接。

如前所述,它并不理想,dynamo DB 不是关系数据库,但有时您需要做一些事情,例如维护两个表中 ID 之间的映射,如果您遇到这种情况,请使用类似的库pandas 连同 SDK 可以帮助您。

我有一个正在使用 dynamo DB 的应用程序,我现在希望我只是选择使用 postgres。