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

Amazon Athena DynamoDB 连接器

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

先决条件

参数

使用本节中的 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 函数与您的 DynamoDB 表不在同一区域,使用该参数可能会导致更高的带宽使用量。

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

在 Amazon Glue 中设置数据库和表

由于该连接器的内置架构推理功能有限,因此您可能需要将 Amazon Glue 用于元数据。要使 Amazon Glue 表可与 DynamoDB 配合使用,您必须拥有 Amazon Glue 表,适用于您要为其提供补充元数据的 DynamoDB 表。

将 Amazon Glue 表用于补充元数据

  1. 当您在 Amazon Glue 控制台中编辑表和数据库时,可以根据需要添加以下表属性。如果您使用 Amazon Glue DynamoDB 爬网程序,将自动设置这些属性。

    • dynamodb – 向 Athena DynamoDB 连接器指明可将该表用于补充元数据的字符串。您可以在以下任一位置输入 dynamodb 字符串:

      • 在表属性中名为 classification(分类)的字段下(完全匹配)。

      • 在表存储描述符 location(位置)字段中(子字符串匹配)。

      • 在表存储描述符参数中名为 classification(分类)的字段下(完全匹配)。

    • dynamo-db-flag – 指明数据库包含 Athena DynamoDB 连接器用于补充元数据的表的字符串。对于 default 以外的 Amazon Glue 数据库,此字符串为必选项。dynamo-db-flag 属性用于筛选出拥有大量数据库的账户中的不相关数据库。此字符串应该位于 Amazon Glue 数据库的位置 URI 中(子字符串匹配)。

    • 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 属性。

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

所需权限

请查看 athena-dynamodb.yaml 文件的 Policies 一节,以了解有关此连接器所需的 IAM 策略的完整详细信息。以下是简短摘要。

  • 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 是根据您的表的大小及其预调配吞吐量以启发方式确定的。

谓词下推将在 Lambda 函数中执行,以减少查询扫描的数据。但是,选择列的子集有时会导致更长的查询执行运行时。LIMIT 子句会减少扫描的数据量,但如果未提供谓词,则预期要使用 LIMIT 子句进行 SELECT 个查询,扫描至少 16MB 的数据。

无论应用的 LIMIT 子句如何,DynamoDB 连接器针对较大数据集扫描的数据都将多于针对较小数据集扫描的数据。例如,与较小的底层数据集相比,查询 SELECT * LIMIT 10000 将针对较大底层数据集扫描更多数据。

成本

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

另请参阅

有关此连接器的更多信息,请访问 GitHub.com 上的相应站点