

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

# 使用 Amazon Athena 通过 SQL 查询 Amazon DynamoDB 表
<a name="query-amazon-dynamodb-tables-sql-amazon-athena"></a>

*Gavin Perrie、Ajit Ambike 和 Brad Yates，Amazon Web Services*

## Summary
<a name="query-amazon-dynamodb-tables-sql-amazon-athena-summary"></a>

如果您的数据包含除 Amazon Simple Storage Service（Amazon S3）之外的其他数据来源，可以使用联合查询来访问这些关系型、非关系型、对象型或自定义数据来源。此模式展示了如何使用 SQL 数据来源连接器，通过 Amazon Athena 配置对 Amazon DynamoDB 的联合查询访问。

您可以使用此模式执行以下操作：
+ 使用 SQL 查询 DynamoDB 表。
+ 在 Athena 中运行联合 SQL 查询，并将 DynamoDB 表与其他受支持的数据来源联接。

## 先决条件和限制
<a name="query-amazon-dynamodb-tables-sql-amazon-athena-prereqs"></a>

**先决条件**
+ 一个 DynamoDB 表。
+ 有一个 Athena 工作组设置为使用 Athena 引擎版本 2。有关说明，请参阅 [Athena 文档](https://docs.aws.amazon.com/athena/latest/ug/engine-versions-changing.html)。
+ 一个 S3 存储桶，`AthenaDynamoDBConnector` AWS Lambda 函数可以在其中泄露数据。Lambda 函数必须与 S3 存储桶位于同一 AWS 区域。

如果是首次访问 Athena，则需要一个额外的 S3 存储桶用作查询结果的存储位置。有关说明，请参阅 [Athena 文档](https://docs.aws.amazon.com/athena/latest/ug/querying.html#query-results-specify-location-console)。

**限制**
+ 不支持诸如 [INSERT INTO](https://docs.aws.amazon.com/athena/latest/ug/insert-into.html) 之类的写入操作。****

**产品版本**
+ [Athena Query Federation 发布于 GitHub](https://github.com/awslabs/aws-athena-query-federation/releases)

## 架构
<a name="query-amazon-dynamodb-tables-sql-amazon-athena-architecture"></a>

**目标架构**

下图显示了模式建立后的连接流程。用户将连接到 Amazon Athena 以提供查询。Athena 会将查询和目标传递给 DynamoDB 数据来源连接器 Lambda 函数，然后函数会检索数据并将其返回给 Athena。如果返回大量数据，Athena 会在打包并返回完整数据集之前，将临时结果存储在溢出存储桶中。

![从用户到 Athena 再到 Lambda 的工作流，Lambda 连接到 S3 存储桶和 DynamoDB 表。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/9d1ee529-36f3-4c7e-a2e7-05b76e09a3d8/images/e50a00cf-a55a-4def-81d5-4d2755dc9a97.png)


## 工具
<a name="query-amazon-dynamodb-tables-sql-amazon-athena-tools"></a>

**AWS 服务**
+ [Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/what-is.html) 是一种交互式查询服务，可帮助您通过使用标准 SQL 直接分析 Amazon Simple Storage Service（Amazon S3）中的数据。此模式使用 [Amazon Athena DynamoDB 连接器，该工具使用亚马逊](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-dynamodb) Athena Query Federation SDK 构建，并通过作为应用程序安装。 AWS Lambda AWS Serverless Application Repository
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一项完全托管式 NoSQL 数据库服务，可提供快速、可预测、可扩展的性能。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，可帮助您运行代码，无需预调配或管理服务器。它只在需要时运行您的代码，并自动进行扩展，因此您只需为使用的计算时间付费。
+ [Amazon Simple Storage Service（Amazon S3）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。

**代码存储库 **

此模式的代码可在 GitHub [Athena Query Federation 存储库中找到。](https://github.com/awslabs/aws-athena-query-federation/releases)

## 操作说明
<a name="query-amazon-dynamodb-tables-sql-amazon-athena-epics"></a>

### 设置和测试 DynamoDB 数据来源连接器
<a name="set-up-and-test-the-ddb-data-source-connector"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 部署 AthenaDynamoDBConnector 应用程序。 | 要部署 AthenaDynamoDBConnecter，请执行以下操作：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/query-amazon-dynamodb-tables-sql-amazon-athena.html) | AWS DevOps | 
| 为 Athena 创建数据来源。 | 要创建数据来源，请执行以下操作：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/query-amazon-dynamodb-tables-sql-amazon-athena.html) | AWS DevOps | 
| 使用 Athena 查询 DynamoDB 表。 | 要查询 DynamoDB 表，请执行以下操作：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/query-amazon-dynamodb-tables-sql-amazon-athena.html) | 应用程序开发人员 | 

## 问题排查
<a name="query-amazon-dynamodb-tables-sql-amazon-athena-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 查询失败：`GENERIC_INTERNAL_ERROR: The bucket is in this region: <region>`*。* | 确保 Athena 溢出存储桶和 Lambda 函数是在同一个 AWS 区域中创建的。 | 
| 新创建的数据来源未显示在 Athena 控制台上。 | Athena 数据目录是区域性的。确保已在尝试使用 Athena 的区域部署 `AthenaDynamoDBConnector`。 | 
| 不能对新创建的数据来源运行查询。 | 检查是否已设定**查询结果位置**。 | 

## 相关资源
<a name="query-amazon-dynamodb-tables-sql-amazon-athena-resources"></a>
+ [亚马逊 Athena DynamoDB 连接器](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-dynamodb)
+ [Amazon Athena 联合查询](https://docs.aws.amazon.com/athena/latest/ug/connect-to-a-data-source.html)