# Snowflake

您可以使用 Snowflake 作为数据管道或复制任务中的目标数据平台。在数据管道中，可以在目标平台上执行各种 ELT 操作，包括存储数据、转换数据、创建数据集市和注册数据。另一方面，复制任务涉及将数据直接从源系统复制到具有基本转换功能的目标系统，但不支持 ELT 操作。

将 Snowflake 设定为目标涉及以下方面：

* 在数据库上配置 [所需的权限](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/TargetConnections/snowflake-target.htm#Permissi)。
* 安装[所需驱动程序](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/TargetConnections/snowflake-target.htm#Driver)。请注意，只有当您通过 数据移动网关 连接到 Snowflake 时，才需要执行此操作。
* 配置连接，指向 Snowflake

## 设置连接属性

要配置连接器，请执行以下操作：

1. 在连接中单击创建连接。

2. 选择 Snowflake 目标连接器，然后提供以下设置：

### 数据目标

#### 数据网关

信息注释此字段不适用于 Qlik Talend Cloud Starter 订阅，因为此订阅层不支持 数据移动网关。

只有当目标数据库无法从 Qlik Cloud 访问时（例如，如果它位于或虚拟专用云中），才需要 数据移动网关，并且只能使用私有链接访问。如果是这种情况，请选择要通过其访问目标数据库的 数据移动网关。

根据您的使用情况，这将和从数据源移动数据时部署的 数据移动网关 相同，或者与之不同。

有关 数据移动网关 用例的信息，请参阅 [什么时候需要 数据移动网关？](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Gateways/replication-gateway.htm#top) 和 [常见用例](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Gateways/replication-gateway.htm#Common)。

如果可以从 Qlik Cloud 直接访问目标数据库，请选择无。

信息注释通过 数据移动网关 访问目标数据库时，还需要在 数据移动网关 计算机上安装相应的驱动程序。有关详细信息，请参阅下文的[驱动程序设置](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/TargetConnections/snowflake-target.htm#Driver)。

### 连接属性

* 服务器：您用于访问 Snowflake 的 URL。例如，myaccount.snowflakecomputing.com。

* 端口：您要用来访问 Snowflake 数据库的端口。默认值为 443。

### 身份验证

选择身份验证方法：

* 用户名和密码

  信息注释选择此方法后，不支持任务设置常规选项卡中的 Snowpipe Streaming 加载方法。

* 密钥对

  您的 Snowflake 数据库必须配置为使用密钥对验证。[配置密钥对身份验证](https://docs.snowflake.com/en/user-guide/key-pair-auth.html#configuring-key-pair-authentication)中描述了这一过程。

  信息注释如果使用 数据移动网关，则需要版本 2024.514 或更高版本才能使用密钥对身份验证。

### 帐户属性

#### 用户名和密码

用户名称和密码：经授权可访问 Snowflake 数据库的用户的用户名和密码。

#### 密钥对

密钥对属性

| 帐户属性 | 描述 |
| --- | --- |
| 用户 | Snowflake 用户。 |
| 私钥文件 | 点击浏览选择您的私钥文件。 |
| 私钥文件密码 | 如果私钥已加密，则为解密私钥的密码。 |

### 数据库属性

* 默认仓库：Snowflake 仓库的名称。您可以在项目设置中覆盖此设置。

* 数据库名称：有两种方法可以用于指定数据库：

  * 方法 1 - 从列表中选择：单击加载数据库，然后选择一个数据库。

  * 方法 2 - 手动：选择手动输入数据库名称，然后输入数据库名称。

### 其他连接属性

您可以根据需要指定其他 ODBC 和 JDBC 连接属性。与 ODBC 和 JDBC 连接都相关的属性（例如“角色”）应添加到两者中。

信息注释

* 如果您正在使用 数据移动网关，版本 2024.554 支持其他连接属性。
* 不支持安全属性（如加密密钥）。
* 不要在连接设置中添加具有专用字段的属性。

#### ODBC 属性

您可以指定其他连接属性，这些属性将在通过 ODBC 驱动程序连接时由数据移动任务（数据湖中的登陆录、复制）使用。

使用字段右侧的 the 新建 icon 和 the 取消 icon 按钮可以根据需要添加或删除特性。

#### JDBC 属性

您可以指定 ELT 任务（注册、存储、转换和数据集市）在通过 JDBC 驱动程序连接时使用的其他连接属性。

使用字段右侧的 the 新建 icon 和 the 取消 icon 按钮可以根据需要添加或删除特性。

### 内部属性

内部属性用于特殊用例，因此不会在对话框中公开。只有在 Qlik 支持部门的指示下，您才应该使用它们。

使用字段右侧的 the 新建 icon 和 the 取消 icon 按钮可以根据需要添加或删除特性。

### 名称

连接的显示名称。

## 先决条件

### 所需的权限

需要以下权限：

如果希望自动创建不存在的模式，则需要权限

* USAGE ON DATABASE
* CREATE SCHEMA ON DATABASE

如果模式已经存在时需要的权限

* USAGE ON DATABASE
* USAGE ON SCHEMA
* CREATE FILE FORMAT ON SCHEMA
* CREATE STAGE ON SCHEMA
* CREATE TABLE ON SCHEMA

### 驱动程序设置

只有通过 数据移动网关 访问数据库时才需要驱动程序。

您可以使用驱动程序安装实用程序（推荐）安装 driver 或手动安装。只有在您遇到驱动程序安装实用程序发生问题的少见情况下，才应尝试手动安装。

#### 使用驱动程序安装实用程序安装驱动程序

本部分介绍如何安装所需的 driver。这个过程包括下载 driver，将其复制到所需的文件夹（见下文），并运行一个脚本来自动安装和配置它。您还可以根据需要运行脚本来更新和卸载 driver。

准备安装

* 请确保在 数据移动 网关服务器上安装了 Python 3.6 或更高版本。

  Python 预装在大多数 Linux 发行版上。您可以通过运行以下命令来检查系统上安装了哪个 Python 版本。

  python3 --version

* 下载 Snowflake ODBC 驱动程序 "snowflake-odbc-&lt;版本&gt;.x86\_64.rpm"。您可以在此路径下面找到受支持版本的直接下载链接：binary-artifacts in /opt/qlik/gateway/movement/drivers/manifests/snowflake.yaml。下载完成后，将文件复制到：

  /opt/qlik/gateway/movement/drivers/snowflake

安装 driver

安装 driver ：

1. 停止 数据移动网关 服务：

   sudo systemctl stop repagent

2. 可选择确认服务已停止：

   sudo systemctl status repagent

   状态应如下所示：

   Active: inactive (dead) since &lt;timestamp&gt; ago

3. 在 数据移动 网关计算机上，将工作目录更改为：

   opt/qlik/gateway/movement/drivers/bin

4. 然后运行以下命令：

   语法：

   ./install snowflake

   否则，将显示 driver 的 EULA。

5. 执行以下选项之一：

   * 重复按 [Enter] 可在 EULA 中缓慢滚动。
   * 重复按空格键可快速滚动 EULA。
   * 按 q 退出许可证文本并显示 EULA 接受选项。

6. 执行以下选项之一：

   * 键入 "y" 并按 [Enter] 接受 EULA 并开始安装。

   * 键入 "n" 并按 [Enter] 拒绝 EULA 并退出安装。

   * 键入“v”并按 [Enter] 以再次查看 EULA。

   将会安装 driver。

7. 等待安装完成（以“完成！”指示），然后启动 数据移动网关 服务：

   sudo systemctl start repagent

8. 可选择确认服务已启动：

   sudo systemctl status repagent

   状态应如下所示：

   Active: active (running) since &lt;timestamp&gt; ago

更新 driver

如果要在安装提供的 driver 之前卸载以前版本的 driver，请运行 update 命令。

更新 driver：

1. 停止 数据移动网关 服务：

   sudo systemctl stop repagent

2. 可选择确认服务已停止：

   sudo systemctl status repagent

   状态应如下所示：

   Active: inactive (dead) since &lt;timestamp&gt; ago

3. 在 数据移动 网关计算机上，将工作目录更改为：

   opt/qlik/gateway/movement/drivers/bin

4. 然后运行以下命令：

   语法：

   ./update snowflake

   否则，将显示 driver 的 EULA。

5. 执行以下选项之一：

   * 重复按 [Enter] 可在 EULA 中缓慢滚动。
   * 重复按空格键可快速滚动 EULA。
   * 按 q 退出许可证文本并显示 EULA 接受选项。

6. 执行以下选项之一：

   * 键入 "y" 并按 [Enter] 接受 EULA 并开始安装。
   * 键入 "n" 并按 [Enter] 拒绝 EULA 并退出安装。
   * 键入“v”并按 [Enter] 可从头开始查看 EULA。

   将卸载旧的 driver，并安装新的 driver。

7. 等待安装完成（以“完成！”指示），然后启动 数据移动网关 服务：

   sudo systemctl start repagent

8. 可选择确认服务已启动：

   sudo systemctl status repagent

   状态应如下所示：

   Active: active (running) since &lt;timestamp&gt; ago

卸载 driver

如果要卸载 driver，请运行 uninstall 命令。

卸载 driver：

1. 停止所有配置为使用此连接器的任务。

2. 在 数据移动 网关计算机上，将工作目录更改为：

   opt/qlik/gateway/movement/drivers/bin

3. 然后运行以下命令：

   语法：

   ./uninstall snowflake

   将卸载 driver。

#### 手动安装驱动程序

只有在自动驱动程序安装未成功完成的情况下，才应尝试手动安装 driver。

您需要同时安装 ODBC 驱动程序和 JDBC 驱动程序。

安装 ODBC 驱动程序

1. 安装 数据移动网关 后，下载 /opt/qlik/gateway/movement/drivers/manifests/snowflake.yaml 中 binary-artifacts 下列出的 snowflake-odbc-&lt;version&gt;x86\_64.rpm 驱动程序文件，并将其复制到 数据移动网关 计算机上。
2. 在 数据移动网关 计算机上安装驱动程序。

安装 JDBC 驱动程序

1. 下载 /opt/qlik/gateway/movement/drivers/manifests/snowflake.yaml 中 binary-artifacts 下列出的 snowflake-jdbc-&lt;version&gt;.jar 文件，并将其复制到 数据移动网关 计算机上的以下文件夹中：

   /opt/qlik/gateway/movement/qcs\_agents/qdi-db-commands/lib

2. 重新启动 数据移动网关 服务，并通过运行 [数据移动网关 服务命令](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Gateways/dm-gateway-managing.htm#Restarti) 中所述的命令检查服务是否已启动

### 端口：

需要为出站通信打开防火墙端口 443。

## 限制和考虑事项

将数据移动到 Snowflake 目标时，以下限制适用：

* 不支持复制名称中带有反斜杠的表（例如 SPECIAL\\TABLE\N）。

### 使用 Snowpipe 数据流加载方法时的限制和注意事项

使用 Snowpipe 数据流作为加载方法时，存在以下限制：
* 仅适用于登陆任务：

  * 由于 Snowpipe 仅支持 INSERT 操作，因此不支持重载和比较更新方法。

* 仅适用于复制任务：

  * 由于 Snowpipe 仅支持 INSERT 操作，因此不支持应用更改复制模式。

  * 在事务期间停止存储更改复制，并在 30 天或更长时间后将其恢复，可能会导致目标上出现重复记录。Snowflake 会在 30 天后自动删除通道。

* 适用于登陆和复制任务：

  * 不支持用户名和密码验证。
  * 不支持 XML 子类型。

## 数据类型

下表显示了使用 Qlik Cloud 时支持的 Snowflake 数据类型以及自 Qlik Cloud 数据类型的默认映射。

本机数据类型信息将被保留，并显示在数据集视图的本机数据类型列中。如果列不可见，则需要打开数据集视图的列选择器，然后选择本机数据类型列。

支持的数据类型

| Qlik Cloud 数据类型 | Snowflake 数据类型 |
| --- | --- |
| BOOLEAN | BOOLEAN |
| BYTES | BINARY（以字节计算的长度） |
| DATE | DATE |
| TIME | TIME（精确度） |
| DATETIME | Snowflake：<br><br><ul> <li> <p>TIMESTAMP</p> </li> </ul><br><br>对于 Snowflake Iceberg：<br><br><ul> <li> <p>TIMESTAMP</p> </li> <li> <p>如果 scale &gt; 7: STRING(37)</p> </li> </ul> |
| INT1 | BYTEINT |
| INT2 | SMALLINT |
| INT4 | INTEGER |
| INT8 | BIGINT |
| NUMERIC | NUMBER（精确度、刻度） |
| REAL4 | FLOAT4 |
| REAL8 | FLOAT8 |
| UINT1 | BYTEINT |
| UINT2 | INTEGER |
| UINT4 | INTEGER |
| UINT8 | BIGINT |
| STRING | VARCHAR（以字节计算的长度） |
| WSTRING | NVARCHAR（以字节计算的长度） |
| BLOB | BINARY (8388608) |
| NCLOB | NVARCHAR (8388608) |
| CLOB | VARCHAR (8388608) |
| JSON | 变体 |

在 Snowflake 中，所有 VARCHAR 列都存储 UTF-8 字符。如果加载到 VARCHAR 列中的数据超出其 128 MB 的最大长度，将发生以下错误：

```
        RetCode: SQL_ERROR  SqlState: 22000 NativeError: 100078 Message: String '{"col1": null, "col2": null, "col3": null, "col4' is too long and would be truncated
        
```

如果在 Snowflake 中处理数组、对象或 TIMESTAMP\_TZ 数据类型，则必须将其转换成二进制数据类型：

* 您有一个注册了其中一种类型的数据任务，然后还有一个以 Iceberg 格式存储表的任务。

* 您有一个 Iceberg 任务，存在其中一种类型，还有一个不涉及 Iceberg 的任务。