

# Snowflake 连接
<a name="aws-glue-programming-etl-connect-snowflake-home"></a>

在 AWS Glue 4.0 及更高版本中，您可以使用 AWS Glue for Spark 在 Snowflake 中读取和写入表。您可以通过 SQL 查询从 Snowflake 中读取。您可以使用用户名和密码连接到 Snowflake。您可以通过 AWS Glue Data Catalog 引用存储在 AWS Secrets Manager 中的 Snowflake 凭证。用于 AWS Glue for Spark 的 Data Catalog Snowflake 凭证与用于爬网程序的 Data Catalog Snowflake 凭证分开存储。必须选择 `SNOWFLAKE` 类型连接，而不是配置为连接到 Snowflake 的 `JDBC` 类型连接。

有关 Snowflake 的更多信息，请参阅 [Snowflake 网站](https://www.snowflake.com/)。有关 AWS 上 Snowflake 的更多信息，请参阅 [Snowflake Data Warehouse on Amazon Web Services](https://aws.amazon.com/financial-services/partner-solutions/snowflake/)。

## 配置 Snowflake 连接
<a name="aws-glue-programming-etl-connect-snowflake-configure"></a>

连接到可通过互联网访问的 Snowflake 数据库没有任何 AWS 先决条件。

或者，您可以执行以下配置，使用 AWS Glue 管理连接凭证。

**使用 AWS Glue 管理连接凭证**

1. 在 Snowflake 中，生成一个用户 *snowflakeUser* 和密码 *snowflakePassword*。

1. 在 AWS Secrets Manager 中，使用您的 Snowflake 凭证创建密钥。要在 Secrets Manager 中创建密钥，请按照 AWS Secrets Manager 文档中[创建 AWS Secrets Manager 密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html#create_secret_cli)中的教程进行操作。创建密钥后，保留密钥名称 *secretName*，以供下一步使用。
   + 选择**键/值对**时，请使用键 `USERNAME` 为 *snowflakeUser* 创建一对。
   + 选择**键/值对**时，请使用键 `PASSWORD` 为 *snowflakePassword* 创建一对。
   + 选择**键/值对**时，您可以向 Snowflake 仓库提供键 `sfWarehouse`。
   + 选择**键/值对**时，您可以将对应的 Spark 属性名称作为键，从而提供其他 Snowflake 连接属性。支持的属性包括：
     + `sfDatabase`：Snowflake 数据库名称
     + `sfSchema`：Snowflake 架构名称
     + `sfRole`：Snowflake 角色名称
     + `pem_private_key`：用于密钥对身份验证的私有密钥

1. 在 AWS Glue Data Catalog 中，通过选择**连接**，然后选择**创建连接**来创建连接。按照连接向导中的步骤完成该过程：
   + 选择**数据来源**时，选择 Snowflake，然后选择**下一步**。
   + 输入连接详细信息，例如主机和端口。输入主机 **Snowflake URL** 时，请提供您的 Snowflake 实例的 URL。URL 通常将使用表单 `account_identifier.snowflakecomputing.com` 中的主机名。但是，URL 格式可能会有所不同，具体取决于您的 Snowflake 帐户类型（例如，AWS、Azure 或 Snowflake 托管）。
   + 选择 IAM 服务角色时，从下拉菜单中选择。这是账户中的 IAM 角色，如果指定了 VPC，则该角色将用于访问 AWS Secrets Manager 和分配 IP。
   + 选择 **AWS 密钥**时，请提供 *secretName*。

1. 在向导的下一步中，设置 Snowflake 连接的属性。

1. 在向导的最后一步中，查看您的设置，然后完成创建连接的过程。

在以下情况下，您可能需要以下内容：
+ 

  适用于托管在 AWS 中 Amazon VPC 上的 Snowflake
  + 您需要对 Snowflake 进行适当的 Amazon VPC 配置。有关如何配置 Amazon VPC 的更多信息，请参阅 Snowflake 文档中的 [AWS PrivateLink & Snowflake](https://docs.snowflake.com/en/user-guide/admin-security-privatelink)。
  + 您需要对 AWS Glue 进行适当的 Amazon VPC 配置。[为 AWS Glue（AWS PrivateLink）配置接口 VPC 端点（AWS PrivateLink）](vpc-interface-endpoints.md)
  + 您需要创建一个提供 Amazon VPC 连接信息的 AWS Glue Data Catalog 连接（以及定义您的 Snowflake 安全凭证的 AWS Secrets Manager 密钥 ID）。使用 AWS PrivateLink 时您的 URL 将发生变化，如前一项目中链接的 Snowflake 文档中所述。
  + 您需要在作业配置中将 Data Catalog 连接作为**附加网络连接**包括在内。

## 从 Snowflake 表中读取
<a name="aws-glue-programming-etl-connect-snowflake-read"></a>

**先决条件：**您想读取的 Snowflake 表。您需要使用 Snowflake 表名 *tableName*。您需要 Snowflake url *snowflakeUrl*、用户名 *snowflakeUser* 和密码 *snowflakePassword*。如果您的 Snowflake 用户没有设置默认命名空间，则需要 Snowflake 数据库名称 *databaseName* 和架构名称 *schemaName*。此外，如果您的 Snowflake 用户没有设置默认仓库，则需要仓库名称 *warehouseName*。

例如：

**其他先决条件：**完成*使用 AWS Glue 管理连接凭证*的步骤，配置 *snowflakeUrl*、*snowflakeUsername* 和 *snowflakePassword*。要查看这些步骤，请参阅 [配置 Snowflake 连接](#aws-glue-programming-etl-connect-snowflake-configure) 上一节。为选择要连接的**附加网络连接**，我们将使用 `connectionName` 参数。

```
snowflake_read = glueContext.create_dynamic_frame.from_options(
  connection_type="snowflake",
  connection_options={
        "connectionName": "connectionName",
        "dbtable": "tableName",
        "sfDatabase": "databaseName",
        "sfSchema": "schemaName",
        "sfWarehouse": "warehouseName",
    }
)
```

 此外，您还可以使用 `autopushdown` 和 `query` 参数来读取 Snowflake 表的一部分。这可能比在结果加载到 Spark 后对其进行筛选要有效得多。举一个例子，其中所有销售额都存储在同一个表中，但您只需要分析假日期间某家商店的销售额即可。如果这些信息存储在表中，则可以使用谓词下推来检索结果，如下所示：

```
snowflake_node = glueContext.create_dynamic_frame.from_options(
    connection_type="snowflake",
    connection_options={
        "autopushdown": "on",
        "query": "select * from sales where store='1' and IsHoliday='TRUE'",
        "connectionName": "snowflake-glue-conn",
        "sfDatabase": "databaseName",
        "sfSchema": "schemaName",
        "sfWarehouse": "warehouseName",
    }
)
```

## 写入 Snowflake 表
<a name="aws-glue-programming-etl-connect-snowflake-write"></a>

**先决条件：**您要写入的 Snowflake 数据库。您将需要一个最新或所需的表名，如 *tableName*。您需要 Snowflake url *snowflakeUrl*、用户名 *snowflakeUser* 和密码 *snowflakePassword*。如果您的 Snowflake 用户没有设置默认命名空间，则需要 Snowflake 数据库名称 *databaseName* 和架构名称 *schemaName*。此外，如果您的 Snowflake 用户没有设置默认仓库，则需要仓库名称 *warehouseName*。

例如：

**其他先决条件：**完成*使用 AWS Glue 管理连接凭证*的步骤，配置 *snowflakeUrl*、*snowflakeUsername* 和 *snowflakePassword*。要查看这些步骤，请参阅 [配置 Snowflake 连接](#aws-glue-programming-etl-connect-snowflake-configure) 上一节。为选择要连接的**附加网络连接**，我们将使用 `connectionName` 参数。

```
glueContext.write_dynamic_frame.from_options(
    connection_type="snowflake",
    connection_options={
        "connectionName": "connectionName",
        "dbtable": "tableName",
        "sfDatabase": "databaseName",
        "sfSchema": "schemaName",
        "sfWarehouse": "warehouseName",
    },
)
```

## Snowflake 连接选项参考
<a name="aws-glue-programming-etl-connect-snowflake-reference"></a>

Snowflake 连接类型采用以下连接选项：

您可以从 Data Catalog 连接（`sfUrl`、`sfUser`、`sfPassword`）中检索本节中的某些参数，在这种情况下，您无需提供这些参数。您可以提供参数 `connectionName` 来实现。

您可以使用 `secretId` 参数检索 AWS Secrets Manager 密钥中的连接参数。如果您使用 Secrets Manager 并且密钥中存在以下 Spark 属性，则系统会自动检索这些属性：
+ `sfUser`（使用密钥 `USERNAME` 或 `sfUser`）
+ `sfPassword`（使用密钥 `PASSWORD` 或 `sfPassword`）
+ `sfWarehouse`（使用密钥 `sfWarehouse`）
+ `sfDatabase`（使用密钥 `sfDatabase`）
+ `sfSchema`（使用密钥 `sfSchema`）
+ `sfRole`（使用密钥 `sfRole`）
+ `pem_private_key`（使用密钥 `pem_private_key`）

**属性优先顺序：**在多个位置指定了相同属性时，AWS Glue 将按以下优先顺序（从高到低）处理：

1. 作业代码中显式提供的连接选项

1. Data Catalog 连接属性

1. AWS Secrets Manager 密钥值（指定 `secretId` 时）

1. Snowflake 用户默认值

连接到 Snowflake 时通常使用以下参数。
+ `sfDatabase` - 如果未在 Snowflake 中设置用户默认值，则为必填项。用于读/写。连接后用于会话的数据库。
+ `sfSchema` - 如果未在 Snowflake 中设置用户默认值，则为必填项。用于读/写。连接后用于会话的架构。
+ `sfWarehouse` - 如果未在 Snowflake 中设置用户默认值，则为必填项。用于读/写。连接后用于会话的默认虚拟仓库。
+ `sfRole` - 如果未在 Snowflake 中设置用户默认值，则为必填项。用于读/写。连接后用于会话的默认安全角色。
+ `sfUrl` -（必需）用于读/写。采用以下格式指定账户的主机名：`account_identifier.snowflakecomputing.com`。有关账户标识符的更多信息，请参阅 Snowflake 文档中的 [Account Identifiers](https://docs.snowflake.com/en/user-guide/admin-account-identifier)。
+ `sfUser` -（必需）用于读/写。Snowflake 用户的登录名。
+ `sfPassword` —（除非提供 `pem_private_key`，否则为必填项）用于读/写。Snowflake 用户的密码。
+ `dbtable` - 处理完整表格时为必填项。用于读/写。要读取的表的名称或要写入数据的表的名称。读取时，将检索所有列和记录。
+ `pem_private_key` - 用于读/写。未加密的 b64 编码私钥字符串。Snowflake 用户的私钥。通常将其从 PEM 文件中复制出来。有关更多信息，请参阅 Snowflake 文档中的[密钥对身份验证和密钥对轮换](https://docs.snowflake.com/en/user-guide/key-pair-auth)。
+ `query` - 使用查询读取时为必填项。用于读取。要运行的确切查询（`SELECT` 语句）

以下选项用于配置连接到 Snowflake 过程中的特定行为。
+ `preactions` - 用于读/写。有效值：以分号分隔的 SQL 语句列表作为字符串。SQL 语句在 AWS Glue 和 Snowflake 之间传输数据之前运行。如果语句包含 `%s`，则 `%s` 将替换为操作所引用的表名。
+ `postactions` - 用于读/写。SQL 语句在 AWS Glue 和 Snowflake 之间传输数据之后运行。如果语句包含 `%s`，则 `%s` 将替换为操作所引用的表名。
+ `autopushdown` - 默认值：`"on"`。有效值：`"on"`、`"off"`。此参数控制是否启用自动查询下推。如果启用了下推，那么当在 Spark 上运行查询时，如果可以将部分查询“下推”到 Snowflake 服务器，则会将其下推。这提高了某些查询的性能。有关是否可以下推查询的信息，请参阅 Snowflake 文档中的 [Pushdown](https://docs.snowflake.com/en/user-guide/spark-connector-use#pushdown)。

此外，AWS Glue 可能支持 Snowflake Spark 连接器上可用的某些选项。有关 Snowflake Spark 连接器上可用选项的更多信息，请参阅 Snowflake 文档中的 [Setting Configuration Options for the Connector](https://docs.snowflake.com/en/user-guide/spark-connector-use#setting-configuration-options-for-the-connector)。

## Snowflake 身份验证方法
<a name="aws-glue-programming-etl-connect-snowflake-authentication"></a>

AWS Glue 支持使用以下身份验证方法连接到 Snowflake：
+ **用户名和密码身份验证：**提供 `sfUser` 和 `sfPassword` 参数。
+ **密钥对身份验证：**提供 `sfUser` 和 `pem_private_key` 参数。使用密钥对身份验证方法时，`sfPassword` 参数不是必需的。

这两种身份验证方法都完全受支持，并且可以使用任意连接选项、Data Catalog 连接或 AWS Secrets Manager 密钥组合进行配置。

## Snowflake 连接器限制
<a name="aws-glue-programming-etl-connect-snowflake-limitations"></a>

使用 AWS Glue for Spark 连接到 Snowflake 需要遵守以下限制。
+ 此连接器不支持作业书签。有关作业书签的更多信息，请参阅 [使用作业书签跟踪已处理的数据](monitor-continuations.md)。
+ 此连接器不支持 Snowflake 使用 `create_dynamic_frame.from_catalog` 和 `write_dynamic_frame.from_catalog` 方法对 AWS Glue Data Catalog 中的表进行读取和写入。
+ 此连接器支持用户名/密码身份验证和密钥对身份验证方法。目前不支持其他身份验证方法（例如 OAuth 或 SAML）。
+ 流作业中不支持此连接器。
+ 此连接器在检索信息（例如使用 `query` 参数）时支持基于 `SELECT` 语句的查询。不支持其他类型的查询（例如 `SHOW`、`DESC` 或 DML 语句）。
+ Snowflake 将通过 Snowflake 客户端提交的查询文本（即 SQL 语句）的大小限制为每条语句 1MB。有关更多详细信息，请参阅 [Limits on Query Text Size](https://docs.snowflake.com/en/user-guide/query-size-limits)。