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

Amazon Athena DocumentDB 连接器

Amazon Athena DocumentDB 连接器使 Athena 可以与您的 DocumentDB 实例通信,以便您可以使用 SQL 查询 DocumentDB 数据。该连接器还可与任何与 MongoDB 兼容的终端节点配合使用。

与传统的关系数据存储不同,Amazon DocumentDB 集合没有集架构。DocumentDB 没有元数据存储。DocumentDB 集合中的每个条目均可具有不同字段和数据类型。

DocumentDB 连接器支持两种生成表架构信息的机制:基本架构推理和 Amazon Glue Data Catalog 元数据。

默认设置为架构推理。此选项将扫描您的集合中的少量文档,形成所有字段的并集,并强制使用非重叠数据类型的字段。此选项适用于条目大多为统一的集合。

对于具有更多数据类型的集合,该连接器支持从 Amazon Glue Data Catalog 检索元数据。如果该连接器发现与您的 DocumentDB 数据库和集合名称相匹配的 Amazon Glue 数据库和表,它将从相应的 Amazon Glue 表中获取其架构信息。在您创建 Amazon Glue 表时,我们建议您将其设置为您可能想从 DocumentDB 集合访问的所有字段的超集。

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

先决条件

参数

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

  • 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 账户中获取元数据。

  • default_docdb – 如果存在,则指定在不存在特定于目录的环境变量时要使用的 DocumentDB 连接字符串。

  • disable_projection_and_casing –(可选)禁用投影和大小写。在您需要查询使用区分大小写的列名称的 Amazon DocumentDB 表时使用。disable_projection_and_casing 参数使用以下值来指定大小写和列映射的行为:

    • false – 这是默认设置。投影已启用,连接器要求所有列名称为小写。

    • true – 禁用投影和区分大小写。在使用 disable_projection_and_casing 参数时,请记住以下几点:

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

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

  • enable_case_insensitive_match –(可选)如果是 true,则对 Amazon DocumentDB 中的架构和表名执行搜索,搜索不区分大小写。默认为 false。如果查询包含大写的架构名或表名,则使用该参数。

指定连接字符串

您可以提供一个或多个属性,用于定义与该连接器配合使用的 DocumentDB 实例的 DocumentDB 连接详细信息。为此,请设置一个与您要在 Athena 中使用的目录名称相对应的 Lambda 环境变量。例如,假设您要使用以下查询来查询 Athena 中的两个不同 DocumentDB 实例:

SELECT * FROM "docdb_instance_1".database.table
SELECT * FROM "docdb_instance_2".database.table

您必须向 Lambda 函数中添加以下两个环境变量,然后才能使用这两个 SQL 语句:docdb_instance_1docdb_instance_2。每个环境变量的值均应为以下格式的 DocumentDB 连接字符串:

mongodb://:@:/?ssl=true&ssl_ca_certs=rds-combined-ca-bundle.pem&replicaSet=rs0

使用密钥

您可以选择将 Amazon Secrets Manager 用于您的连接字符串详细信息的部分值或全部值。要将 Athena 联合查询功能与 Secrets Manager 配合使用,连接到您的 Lambda 函数的 VPC 应该拥有互联网访问权限或者 VPC 端点,以连接到 Secrets Manager。

如果您使用语法 ${my_secret} 将来自 Secrets Manager 的密钥的名称放入连接字符串,该连接器会将 ${my_secret} 替换为来自 Secrets Manager 的纯文本值。密钥应存储为具有值 <username>:<password> 的纯文本密钥。存储为 {username:<username>,password:<password>} 的密钥将无法正确传递到连接字符串。

密钥也可以完全用于整个连接字符串,并且可以在密钥中定义用户名和密码。

例如,假设您将 docdb_instance_1 的 Lambda 环境变量设置为以下值:

mongodb://${docdb_instance_1_creds}@myhostname.com:123/?ssl=true&ssl_ca_certs=rds-combined-ca-bundle.pem&replicaSet=rs0

Athena 查询联合软件开发工具包 (SDK) 将自动尝试从 Secrets Manager 检索名为的密钥 docdb_instance_1_creds 的密钥,然后注入该值来替换 ${docdb_instance_1_creds}${ } 字符组合所包含的该连接字符串的任何部分将被解释为来自 Secrets Manager 的密钥。如果您指定了该连接器在 Secrets Manager 中无法找到的密钥名称,则该连接器不会替换该文本。

在 Amazon Glue 中设置数据库和表

由于该连接器的内置架构推理功能扫描有限数量的文档,并且仅支持一部分数据类型,因此您可能需要改为将 Amazon Glue 用于元数据。

要使 Amazon Glue 表可与 Amazon DocumentDB 配合使用,您必须拥有 Amazon Glue 数据库和表,适用于您要为其提供补充元数据的 DocumentDB 数据库和集合。

将 Amazon Glue 表用于补充元数据
  1. 当您在 Amazon Glue 控制台中编辑表和数据库时,可以添加以下表属性。

    • docdb-metadata-flag – 此属性将向 DocumentDB 连接器指明该连接器可将该表用于补充元数据。只要表属性的列表中存在 docdb-metadata-flag 属性,您就可以为 docdb-metadata-flag 提供任何值。

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

  3. (可选)添加 columnMapping 表属性。此属性用于定义列名映射。如果 Amazon Glue 列命名规则阻止您创建列名称与 Amazon DocumentDB 表相同的 Amazon Glue 表,请使用此属性。这可能很有用,因为 Amazon DocumentDB 列名称中允许使用大写字母,但 Amazon Glue 列名称中不允许使用。

    columnMapping 属性值应为采用 col1=Col1,col2=Col2 格式的一组映射。

    注意

    列映射仅适用于顶级列名称,不适用于嵌套字段。

    在添加 Amazon Glue columnMapping 表属性后,您可以移除 disable_projection_and_casing Lambda 环境变量。

  4. 请确保使用适合 Amazon Glue 的数据类型,如本文档中所列。

数据类型支持

本节列出了 DocumentDB 连接器用于架构推断的数据类型,以及使用 Amazon Glue 元数据时的数据类型。

架构推理数据类型

DocumentDB 连接器的架构推断功能会尝试将值推断为属于以下数据类型之一。该表显示了适用于 Amazon DocumentDB、Java 和 Apache Arrow 的相应数据类型。

Apache Arrow Java 或 DocDB
VARCHAR 字符串
INT 整数
BIGINT 长整型
BIT 布尔值
FLOAT4 浮点型
FLOAT8 Double
TIMESTAMPSEC Date
VARCHAR ObjectId
LIST 列出
STRUCT 文档

Amazon Glue 数据类型

如果将 Amazon Glue 用于补充元数据,则可配置以下数据类型。该表显示了适用于 Amazon Glue 和 Apache Arrow 的相应数据类型。

Amazon Glue Apache Arrow
int INT
bigint BIGINT
double FLOAT8
float FLOAT4
布尔值 BIT
binary VARBINARY
字符串 VARCHAR
列出 LIST
Struct STRUCT

所需权限

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

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

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

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

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

  • Amazon Secrets Manager 读取权限 - 如果您选择在 Secrets Manager 中存储 DocumentDB 端点详细信息,则必须授予该连接器针对这些秘密的访问权限。

  • VPC 访问权限 - 该连接器需要能够连接和断开您的 VPC 接口,以便它能连接到 VPC 并与您的 DocumentDB 实例通信。

Performance

Athena Amazon DocumentDB 连接器当前不支持并行扫描,但会尝试下推谓词作为其 DocumentDB 查询的组成部分,并且针对 DocumentDB 集合索引的谓词将显著减少扫描的数据。

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

传递查询

Athena Amazon DocumentDB 连接器支持传递查询,并且以 NoSQL 为基础。有关查询 Amazon DocumentDB 的信息,请参阅《Amazon DocumentDB Developer Guide》中的 Querying

要在 Amazon DocumentDB 中执行传递查询,请使用以下语法:

SELECT * FROM TABLE( system.query( database => 'database_name', collection => 'collection_name', filter => '{query_syntax}' ))

以下示例对 TPCDS 集合中的 example 数据库进行了查询,筛选出书名为《Bill of Rights》的所有书籍。

SELECT * FROM TABLE( system.query( database => 'example', collection => 'tpcds', filter => '{title: "Bill of Rights"}' ))

另请参阅