使用 Athena 访问、查询和联接 Amazon DynamoDB 表 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Athena 访问、查询和联接 Amazon DynamoDB 表

由 Moinul Al-Mamun 创作 () AWS

环境:生产

技术:分析;数据库;无服务器

AWS服务:亚马逊 Athena;亚马逊 DynamoDB;Lambda;亚马逊 S3 AWS

Summary

此模式说明如何使用 Amazon Athena DynamoDB 连接器在 Amazon Athena 和 Amazon DynamoDB 之间建立连接。连接器使用 AWS Lambda 函数查询 DynamoDB 中的数据。您无需编写任何代码即可设置连接。建立连接后,您可以使用 Athena 联合查询来自 Athena 的命令来快速访问和分析 DynamoDB 表。SQL您还可以将一个或多个 DynamoDB 表相互联接,或联接到其他数据来源,例如 Amazon Redshift 或 Amazon Aurora。

先决条件和限制

先决条件

  • 有权管理 DynamoDB 表、Athena 数据源、Lambda 以及身份AWS和访问管理 () 角色的活跃AWS账户 IAM

  • 一个 Amazon Simple Storage Service(Amazon S3)存储桶,Athena 可以在其中存储查询结果

  • 一个 S3 存储桶,Athena DynamoDB 连接器可以在其中保存数据

  • 支持 Athena 引擎版本 2 的AWS区域

  • IAM访问 Athena 的权限和所需的 S3 存储桶

  • Amazon Athena DynamoDB 连接器,已安装

限制

查询 DynamoDB 表需要付费。表大小超过几千兆字节 (GBs) 可能会产生高昂的成本。我们建议您在执行任何全表SCAN操作之前考虑成本。有关更多信息,请参阅 Amazon DynamoDB 定价。为了降低成本并实现高性能,我们建议您始终LIMIT在查询中使用(例如SELECT * FROM table1 LIMIT 10)。另外,在生产环境中执行JOIN或 B GROUP Y 查询之前,请考虑表的大小。如果您的表太大,请考虑其他选项,例如将表迁移到 Amazon S3

架构

下图显示了用户如何在 Athena 的 DynamoDB 表上运行SQL查询。

连接 Athena 和 DynamoDB 以运行查询的工作流程。SQL

图表显示了以下工作流:

  1. 要查询 DynamoDB 表,用户需要从 Athena 运行SQL查询。

  2. Athena 启动 Lambda 函数。

  3. Lambda 函数查询 DynamoDB 表中请求的数据。

  4. DynamoDB 将请求的数据返回给 Lambda 函数。然后,该函数通过 Athena 将查询结果传输给用户。

  5. Lambda 函数将数据存储在 S3 存储桶中。

技术堆栈

  • Amazon Athena

  • Amazon DynamoDB

  • Amazon S3

  • AWSLambda

工具

  • Amazon Athena 是一项交互式查询服务,可帮助您使用标准直接在 Amazon S3 中分析数据。SQL

  • Amazon Athena DynamoDB 连接器AWS是一款工具,它使 Athena 能够连接 DynamoDB 并使用查询访问您的表。SQL

  • Amazon DynamoDB 是一项完全托管的SQL无数据库服务,可提供快速、可预测和可扩展的性能。

  • AWSLambda 是一项计算服务,可帮助您运行代码,而无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。

操作说明

任务描述所需技能

创建第一个示例表。

  1. 登录AWS管理控制台并打开 DynamoDB 控制台。

  2. 选择创建表

  3. 对于表名称,输入 dydbtable1

  4. 对于分区密钥请输入PK1

  5. 对于排序键,输入 SK1

  6. 表设置部分中,选择自定义设置

  7. 表类部分中,选择 DynamoDB 标准

  8. 读/写容量设置部分中,对于容量模式,选择按需

  9. 静态加密部分中,选择由 Amazon DynamoDB 拥有

  10. 选择创建表

开发人员

将示例数据插入到第一个表中。

  1. 打开 DynamoDB 控制台

  2. 在导航窗格中,选择,然后在名称列中选择您的表。

  3. 选择操作,然后选择创建项目

  4. 选择JSON视图

  5. 属性编辑器的标题栏中,关闭查看 DynamoDB JSON

  6. 属性编辑器中,逐个输入以下示例数据:

{ "PK1": "1234", "SK1": "info", "Salary": "5000" }
{ "PK1": "1235", "SK1": "info", "Salary": "5200" }
开发人员

创建第二个示例表。

  1. 打开 DynamoDB 控制台

  2. 选择 Create Table

  3. 对于表名称,输入 dydbtable2

  4. 对于分区键,输入 PK2

  5. 对于排序键,输入 SK2

  6. 表设置部分中,选择自定义设置

  7. 表类部分中,选择 DynamoDB 标准

  8. 读/写容量设置部分中,对于容量模式,选择按需

  9. 静态加密部分中,选择由 Amazon DynamoDB 拥有

  10. 选择创建表

开发人员

将示例数据插入到第二个表中。

  1. 打开 DynamoDB 控制台

  2. 在导航窗格中,选择,然后在名称列中选择您的表。

  3. 选择操作,然后选择创建项目

  4. 属性编辑器的标题栏中,关闭查看 DynamoDB JSON

  5. 属性编辑器中,逐个输入以下示例数据:

{ "PK2": "1234", "SK2": "bonus", "Bonus": "500" }
{ "PK2": "1235", "SK2": "bonus", "Bonus": "1000" }
开发人员
任务描述所需技能

设置数据来源连接器。

为 DynamoDB 创建数据来源,然后创建 Lambda 函数以连接到该数据来源。

  1. 登录AWS管理控制台并打开 Athena 控制台。

  2. 在导航窗格中,选择数据来源,然后选择创建数据来源

  3. 选择 Amazon DynamoDB 数据来源,然后选择下一步

  4. 数据源详细信息部分的数据源名称中,输入 testDynamoDB

  5. 连接详细信息 部分中,选择已部署的 Lambda 函数,或者如果您没有要用于此模式的 Lambda 函数,请选择 创建 Lambda 函数注意:有关创建 Lambda 函数的更多信息,请参阅《Lambda 开发人员指南》中的 Lambda 入门

  6. (可选)如果您选择创建 Lambda 函数,则必须先配置 Java 应用程序包含的AWS CloudFormation 模板,然后再部署该堆栈。该模板包括 ApplicationName SpillBucket、 AthenaCatalogName、和其他应用程序设置。注意:部署此基于 Java 的应用程序后,堆栈将创建一个 Lambda 函数,使 Athena 能够与 DynamoDB 进行通信。这使您可以通过SQL命令访问您的表。

  7. 部署 Lambda 函数。

  8. 选择下一步

开发人员

验证 Lambda 函数是否可以访问 S3 溢出存储桶。

  1. 打开 Lambda 控制台

  2. 在导航窗格中,选择函数,然后选择您之前创建的函数。

  3. 选择配置选项卡。

  4. 在左窗格中,选择环境变量,然后确认键的值为 spill_bucket

  5. 在左侧窗格中,选择 “权限”,然后在 “执行角色” 部分中,选择附加的IAM角色。注意:您将被引导到控制台中附加到您的 Lambda 函数的IAMIAM角色。

  6. 确认您对 spill_bucket 存储桶具有写入权限。

如果遇到错误,请参阅此模式中的其他信息部分以获取指导。

开发人员
任务描述所需技能

查询 DynamoDB 表。

  1. 登录AWS管理控制台并打开 Athena 控制台。

  2. 在导航窗格中,选择数据来源,然后选择创建数据来源

  3. 在导航窗格中,选择 Query editor (查询编辑器)

  4. 编辑器选项卡的数据部分中,对于数据来源,为数据来源选择数据源。

  5. 对于数据库,选择您的数据库。

  6. 对于查询 1,输入以下查询:SELECT * FROM dydbtable1 t1;

  7. 选择运行,然后验证表中的输出。

  8. 对于查询 2,输入以下查询:SELECT * FROM dydbtable2 t2;

  9. 选择运行,然后验证表中的输出。

开发人员

连接两个 DynamoDB 表。

DynamoDB 是一个SQL无数据存储,不支持SQL联接操作。因此,您必须对两个 DynamoDB 表执行联接操作:

  1. 选择加号图标以创建另一个查询。

  2. 对于查询 3,输入以下查询:

SELECT pk1, salary, bonus FROM dydbtable1 t1 JOIN dydbtable2 t2 ON t1.pk1 = t2.pk2;
开发人员

相关资源

其他信息

如果您在 Athena 中使用 spill_bucket{bucket_name}/folder_name/ 格式运行查询,则可能会收到以下错误消息:

"GENERIC_USER_ERROR: Encountered an exception[java.lang.RuntimeException] from your LambdaFunction[arn:aws:lambda:us-east-1:xxxxxx:function:testdynamodb] executed in context[retrieving meta-data] with message[You do NOT own the spill bucket with the name: s3://amzn-s3-demo-bucket/athena_dynamodb_spill_data/] This query ran against the "default" database, unless qualified by the query. Please post the error message on our forum or contact customer support with Query Id: [query-id]"

要解决此错误,请将 Lambda 函数的环境变量更新为{bucket_name_only},然后更新spill_bucket以下 Lambda 存储桶写入IAM权限策略:

{ "Action": [ "s3:GetObject", "s3:ListBucket", "s3:GetBucketLocation", "s3:GetObjectVersion", "s3:PutObject", "s3:PutObjectAcl", "s3:GetLifecycleConfiguration", "s3:PutLifecycleConfiguration", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::spill_bucket", "arn:aws:s3:::spill_bucket/*" ], "Effect": "Allow" }

或者,您可以删除之前创建的 Athena 数据来源连接器,然后仅对 spill_bucket 使用 {bucket_name} 重新创建它。