Amazon Athena DynamoDB 连接器 - Amazon Athena
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

Amazon Athena DynamoDB 连接器

Amazon Athena DynamoDB 连接器使 Amazon Athena 可以与 DynamoDB 通信,以便您可以使用 SQL 查询表。写入操作不受支持,例如 INSERT INTO

如果您在账户中启用了 Lake Formation,则您在 Amazon Serverless Application Repository 中部署的 Athena 联合身份 Lambda 连接器的 IAM 角色必须在 Lake Formation 中具有 Amazon Glue Data Catalog 的读取权限。

前提条件

参数

使用本节中的 Lambda 环境变量来配置 DynamoDB 连接器。

  • spill_bucket - 为超出 Lambda 函数限制的数据指定 Amazon S3 存储桶。

  • spill_prefix -(可选)默认为指定 spill_bucket(称为 athena-federation-spill)中的子文件夹。我们建议您在此位置配置 Amazon S3 存储生命周期,以删除早于预定天数或小时数的溢出内容。

  • spill_put_request_headers —(可选)用于溢出的 Amazon S3 putObject 请求的请求标头和值的 JSON 编码映射(例如 {"x-amz-server-side-encryption" : "AES256"})。有关其他可能的标头,请参阅《Amazon Simple Storage Service API 参考》中的 PutObject

  • kms_key_id -(可选)默认情况下,将使用经过 AES-GCM 身份验证的加密模式和随机生成的密钥对溢出到 Amazon S3 的任何数据进行加密。要让您的 Lambda 函数使用 KMS 生成的更强的加密密钥(如 a7e63k4b-8loc-40db-a2a1-4d0en2cd8331),您可以指定 KMS 密钥 ID。

  • disable_spill_encryption -(可选)当设置为 True 时,将禁用溢出加密。默认值为 False,此时将使用 AES-GCM 对溢出到 S3 的数据使用进行加密 - 使用随机生成的密钥,或者使用 KMS 生成密钥。禁用溢出加密可以提高性能,尤其是当您的溢出位置使用服务器端加密时。

  • disable_glue -(可选)如果存在且设置为 true,则该连接器不会尝试从 Amazon Glue 检索补充元数据。

  • glue_catalog –(可选)使用此选项指定跨账户 Amazon Glue 目录。默认情况下,该连接器将尝试从其自己的 Amazon Glue 账户中获取元数据。

  • disable_projection_and_casing –(可选)禁用投影和大小写。如果您要查询列名中有大小写的 DynamoDB 表,并且不想在您的 Amazon Glue 表上指定 columnMapping 属性,请使用此参数。

    disable_projection_and_casing 参数使用以下值来指定大小写和列映射的行为:

    • auto – 当检测到以前不支持的类型,并且未在表上设置列名称映射时,禁用投影和大小写。这是默认设置。

    • always – 无条件禁用投影和大小写。当您的 DynamoDB 列名称中有大小写,但您不想指定任何列名称映射时,此参数很有用。

    在使用 disable_projection_and_casing 参数时,请记住以下几点:

    • 使用该参数可能会导致更高的带宽使用量。此外,如果 Lambda 函数与数据来源处于不同的 Amazon Web Services 区域,则由于带宽使用量较高,会产生更高的标准 Amazon 跨区域传输成本。有关跨区域传输成本的更多信息,请参阅 Amazon 合作伙伴网络博客中的服务器和无服务器架构的 Amazon 数据传输费用

    • 由于传输的字节数越多,并且字节数越大,需要反序列化时间越长,因此整体延迟可能会增加。

在 Amazon Glue 中设置数据库和表

由于该连接器的内置架构推理功能有限,因此您可能需要将 Amazon Glue 用于元数据。为此,您必须在 Amazon Glue 中有一个数据库和表。要将其与 DynamoDB 一起使用,您必须编辑其属性。

在 Amazon Glue 控制台中编辑表属性
  1. 登录 Amazon Web Services Management Console,然后打开 Amazon Glue 控制台,网址为:https://console.aws.amazon.com/glue/

  2. 选择 Databases(数据库)选项卡。

    Databases(数据库)页面上,您可以编辑现有的数据库,也可以选择 Add database(添加数据库)来创建数据库。

  3. 在数据库列表中,选择要编辑的数据库的链接。

  4. 选择编辑

  5. Update a database(更新数据库)页面上,对于 Location(位置),添加字符串 dynamo-db-flag。此关键字指示数据库包含 Athena DynamoDB 连接器用于补充元数据的表,并且是除 default 以外其他 Amazon Glue 数据库所需要的。dynamo-db-flag 属性非常适合用于筛选出具有多个数据库的账户中的数据库。

要在 Amazon Glue 控制台中编辑表属性
  1. 登录 Amazon Web Services Management Console,然后打开 Amazon Glue 控制台,网址为:https://console.aws.amazon.com/glue/

  2. 选择 Tables (表) 选项卡。

    选项卡上编辑现有表。有关手动添加表或使用爬网程序添加表的信息,请参阅《Amazon Glue 开发人员指南》中的在 Amazon Glue 控制台上使用表

  3. 在表的列表中,选择要编辑的表的链接。

  4. 依次选择 Actions(操作)、Edit table(编辑表)。

  5. Edit table(编辑表)页面的 Table properties(表属性)部分,根据需要添加以下表属性。如果您使用 Amazon Glue DynamoDB 爬网程序,将自动设置这些属性。

    • dynamodb – 向 Athena DynamoDB 连接器指明可将该表用于补充元数据的字符串。在表属性中名为 classification(分类)的字段下输入字符串 dynamodb(完全匹配)。

      注意

      设置表属性页面是 Amazon Glue 控制台中的表创建过程的一部分,内含带分类字段的数据格式部分。您无法在此处输入或选择 dynamodb。但在创建表之后,请按照步骤编辑表,并在表属性部分中以键值对的形式输入 classificationdynamodb

    • sourceTable – 可选的表属性,用于定义 DynamoDB 中的源表名称。如果 Amazon Glue 表命名规则阻止您创建与 DynamoDB 表同名的 Amazon Glue 表,请使用此属性。例如,Amazon Glue 表名称中不允许大写字母,但允 DynamoDB 表名称中允许大写字母。

    • columnMapping – 可选的表属性,用于定义列名称映射。如果 Amazon Glue 列命名规则阻止您创建与 DynamoDB 表具有相同列名称的 Amazon Glue 表,请使用此属性。例如,Amazon Glue 列名称中不允许大写字母,但允 DynamoDB 列名称中允许大写字母。该属性值的格式应为 col1=Col1,col2=Col2。请注意,列映射仅适用于顶级列名,不适用于嵌套字段。

    • defaultTimeZone – 可选的表属性,应用于没有明确时区的 datedatetime 值。设置此值是一种很好的做法,可以避免数据来源默认时区与 Athena 会话时区之间存在差异。

    • datetimeFormatMapping – 可选的表属性,用于指定要在解析 Amazon Glue datetimestamp 数据类型的列中的数据时使用的 datedatetime 格式。如果未指定此属性,则该连接器将尝试推断 ISO-8601 格式。如果该连接器无法推断 datedatetime 格式或无法解析原始字符串,则将在结果中省略该值。

      datetimeFormatMapping 值应该采用 col1=someformat1,col2=someformat2 格式。下面是一些示例格式:

      yyyyMMdd'T'HHmmss ddMMyyyy'T'HH:mm:ss

      如果您的列包含没有时区的 datedatetime 值,并且您想使用 WHERE 子句中的列,请为该列设置 datetimeFormatMapping 属性。

  6. 如果您手动定义列,请确保使用适当的数据类型。如果您使用了爬网程序,请验证该爬网程序发现的列和类型。

所需权限

有关此连接器所需 IAM policy 的完整详细信息,请查看 athena-dynamodb.yaml 文件的 Policies 部分。以下列表汇总了所需的权限。

  • Amazon S3 写入权限 – 连接器需要对 Amazon S3 中的位置具有写入权限,以溢出大型查询的结果。

  • Athena GetQueryExecution – 当上游 Athena 查询终止时,该连接器将使用此权限快速失败。

  • Amazon Glue Data Catalog – DynamoDB 连接器需要针对 Amazon Glue Data Catalog 的只读访问权限,以获取架构信息。

  • CloudWatch Logs – 该连接器需要针对 CloudWatch Logs 的访问权限,以存储日志。

  • DynamoDB 读取权限 – 该连接器使用 DescribeTableListSchemasListTablesQueryScan API 操作。

性能

Athena DynamoDB 连接器支持并行扫描,并尝试下推谓词作为其 DynamoDB 查询的组成部分。具有 X 个不同值的哈希键谓词将导致 X 个指向 DynamoDB 的查询调用。所有其他谓词场景都会导致 Y 次扫描调用,其中 Y 是根据您的表的大小及其预调配吞吐量以启发方式确定的。但是,选择一部分列有时会导致查询执行的运行时间延长。

LIMIT 子句和简单谓词将下推,这可以减少扫描的数据量,从而缩短查询执行的运行时间。

LIMIT 子句

LIMIT N 语句用于减少查询扫描的数据量。LIMIT N 下推时,连接器仅向 Athena 返回 N 行。

Predicates

谓词是 SQL 查询的 WHERE 子句中的表达式,其评估结果为布尔值并根据多个条件筛选行。为了增强功能并减少扫描的数据量,Athena DynamoDB 连接器可以组合这些表达式并将其直接推送到 DynamoDB。

以下 Athena DynamoDB 连接器运算符支持谓词下推:

  • 布尔值:AND

  • 相等:EQUAL、NOT_EQUAL、LESS_THAN、LESS_THAN_OR_EQUAL、GREATER_THAN、GREATER_THAN_OR_EQUAL、IS_NULL

组合下推示例

要增强查询功能,组合下推类型,如以下示例所示:

SELECT * FROM my_table WHERE col_a > 10 and col_b < 10 LIMIT 10

有关使用谓词下推来提高联合查询(包括 DynamoDB)性能的文章,请参阅 Amazon 大数据博客中的在 Amazon Athena 中使用谓词下推改善联合查询

故障排除

排序键列上的多个筛选器

错误消息keyConditionExpressions 每个键仅限包含一个条件

原因:在 Athena 引擎版本 3 中,如果查询在 DynamoDB 排序键列上同时具有下限和上限筛选器,可能会出现此问题。由于 DynamoDB 在排序键上不支持多个筛选条件,因此当连接器尝试下推同时应用这两个条件的查询时,会引发错误。

解决方案:将连接器更新为 2023.11.1 或更高版本。有关更新连接器的说明,请参阅 更新数据来源连接器

成本

该连接器的使用成本取决于所使用的底层 Amazon 资源。因为使用扫描的查询可能会消耗大量读取容量单位 (RCU),请认真考虑有关 Amazon DynamoDB 定价的信息。

另请参阅