# 将数据镜像到云数据仓库

镜像任务使您能够从云数据仓库中查询存储在 Qlik 开放式湖空间 中的数据。数据会反映在您的仓库中，而不会重复。镜像表可确保存储和工程成本降至最低，并保持单一数据源。

将数据导入 Qlik 开放式湖空间 后，您可以使用镜像表将数据镜像到云数据仓库。可以使用原生支持 Iceberg 的查询引擎（例如 Amazon Athena）来查询 Iceberg 中的数据。但是，当您想要实现开放的 Iceberg 湖仓一体架构并继续使用数据仓库查询引擎时，镜像表是理想的选择。镜像数据任务通过在数据仓库中将 Iceberg 表声明为外部表和视图，从而自动实现使这些表可访问的过程。数据仓库将 Iceberg 表称为外部视图，因为它不管理该表，而只是从中读取数据。外部表和视图允许您在数据仓库中查询 Iceberg 数据，而无需将数据或表的管理迁移到数据仓库。

镜像任务执行必要的 DDL 语句以创建外部表 and 视图。该表（模式）与变更表和历史记录表一起显示在数据仓库中，但如果您查看表定义，它会显示为在外部表之上创建的视图。数据使用者可以像数据存储在他们的数据仓库环境中一样查询视图。镜像数据提供了高性能，因为 Qlik 会继续管理和优化数据。

支持以下数据仓库：

* Amazon Redshift

* Databricks

* Snowflake

## 镜像到多个数据仓库

单个数据集可以镜像到多个云数据仓库。以下图像演示了如何使用 Qlik 开放式湖空间 管道项目将数据镜像到 Amazon Redshift、Snowflake 和 Databricks：

* 管道使用连接 MySQL QCDI-BETA 从 MySQL 数据库中摄取数据。

* 湖泊登陆任务 EnergyGen\_Lake\_landing 将原始数据摄取到 Amazon S3 存储段中。

* 接下来，存储任务 EnergyGen\_Storage 将数据复制到 S3 位置，以 Apache Iceberg 格式存储数据。

* 镜像数据任务 Redshift Mirror 创建必要的视图以允许从 Amazon Redshift 查询数据，并自动刷新数据。

* 添加了第二个镜像数据任务 Snowflake Mirror，以创建必要的视图，从而允许从 Snowflake 查询数据。该镜像任务使用 Qlik 托管 刷新机制，该机制允许下游转换。

* 添加了第三个镜像数据任务 Databricks Mirror，以允许通过 Databricks Unity Catalog 中的外部目录从 Databricks 查询数据。

![](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Resources/Images/databricks-mirror.png)

## 刷新机制

可供您使用的刷新机制取决于您的云数据仓库提供商，详情如下。

#### Amazon Redshift

镜像到 Amazon Redshift 的数据会自动刷新，无需调度或运行任务。Amazon Redshift 中的所有表和视图名称都会转换为小写，因为 Qlik 开放式湖空间 不支持区分大小写的对象名称（数据库、模式、表或列）。

#### Snowflake

Snowflake 指向反映 Iceberg 中可用数据最新快照的元数据。有两种方法可以刷新元数据：

1. Qlik 托管：此选项需要激活的 Snowflake 仓库，并包括监控和数据预览。当您想要创建下游转换并监控和调度任务时，请选择此选项。Qlik 拥有元数据刷新操作的所有权，因此您可以手动进行配置，例如，每 30 分钟运行一次。此选项与多表转换特别相关，因为所有表的元数据会同时更新。虽然您可能会失去 Snowflake 托管刷新提供的一些实时优势，但您可以保持表之间的一致性。对于多表转换，您可以根据需要随时触发刷新。Qlik 建议您在跟随计划的镜像任务的下游转换任务上设置基于事件的触发。

2. Snowflake 托管：一种利用 Snowpipe 架构的无服务器操作，无需或激活计算仓库。当您不需要下游转换时，推荐使用此选项。刷新间隔是在您创建 Snowflake 目录集成时配置的。要监控自动刷新的状态，请在 Snowflake 中查询 SYSTEM$AUTO\_REFRESH\_STATUS。Qlik 将失去对该过程的所有权，并且无法监控此类任务。

信息注释Snowflake 项目中的每个镜像任务都可以配置其自己的刷新机制：如果您创建两个镜像任务，一个可以使用 Qlik 托管刷新，另一个可以使用 Snowflake 托管刷新。

信息注释如果您尝试查询镜像输出或在转换中使用它，并看到内部服务器错误（请参见下面的示例），则说明您的 Iceberg 元数据与外部目录不同步。要解决此问题，请运行镜像任务以刷新 Iceberg 元数据。

The parquet file 'tg\_open\_lakehouse/bronze/sales/tables/tg\_sales\_ingestion\_bronze\_\_internal.order\_details\_\_internal/data/hdr\_\_scd\_partition=asset\_state/2025\_09\_12\_00\_37\_asset\_state\_apply-4bcbb2eb-4ad3-4d88-bea6-ea611576624e.parquet' for table 'OPENLAKEHOUSE."snowflake\_mirror\_\_internal"."ext\_\_order\_details"' was inaccessible.

#### Databricks

Databricks 外部目录直接从 AWS Glue 读取 Iceberg 元数据。运行镜像任务后，最新的数据快照即可在 Databricks 中进行查询，无需额外的刷新步骤。

##

## 前提条件

以下要求适用于所有支持的数据仓库目标：

* 只有在 Qlik 开放式湖空间 项目中创建了存储任务后，才能添加镜像数据任务。

* 一个存储任务可以有多个镜像数据任务，每个任务针对不同的数据仓库。

* 一个镜像数据任务只能与一个存储任务相关联。

* 要执行转换，请创建一个数据仓库项目并使用镜像数据任务作为源。项目和镜像任务必须使用相同的数据仓库平台，例如 Redshift。

要镜像您的数据，请配置目标数据仓库的设置。

#### Amazon Redshift

* 与您要镜像数据的数据仓库数据库的连接。或者，您可以在创建镜像任务期间创建新连接。有关详细信息，请参阅 [Amazon Redshift](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/TargetConnections/redshift-target.htm)。

* Redshift 扮演的具有 Glue Data Catalog 读取权限 of IAM 角色。以下脚本提供了访问您的目录所需的权限。请确保将 &lt;ICEBERG\_BUCKET\_NAME&gt; 替换为您的存储段名称：

  ```
  {
  	 "Version": "2012-10-17",
          "Statement": [
               {
              	 "Effect": "Allow",
                  "Action": [
                      "glue:GetDatabase",
                      "glue:GetDatabases",
                      "glue:GetTable",
                      "glue:GetTables",
                      "glue:GetPartition",
                      "glue:GetPartitions"
                  ],
                  "Resource": "*"
               },
               {
                  "Effect": "Allow",
                  "Action": [
                      "s3:GetObject",
                      "s3:ListBucket"
                  ],
                  "Resource": [
                      "arn:aws:s3:::<ICEBERG_BUCKET_NAME>",
                      "arn:aws:s3:::<ICEBERG_BUCKET_NAME>/*"
                  ]
              }
  }
  ```

  此角色需要以下信任关系：

  ```
  {
  	"Version": "2012-10-17",
          "Statement": [
               {
                   "Effect": "Allow",
                   "Principal": {
                         "Service": "redshift-serverless.amazonaws.com"
                    },
                   "Action": "sts:AssumeRole"
               },
               {
                   "Effect": "Allow",
                   "Principal": {
                      "Service": "redshift.amazonaws.com"
                      },
                      "Action": "sts:AssumeRole"
               }
        ]
  }
  ```

  信息注释有关详细信息，请参阅 [Amazon Redshift Spectrum 的 IAM 策略](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)。

* Redshift 中的外部模式，指向存储任务数据库。您必须通过执行 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/c-spectrum-iam-policies.html) 命令并指向源 Iceberg 存储任务内部数据库来创建外部 Redshift 模式。外部使用者应从镜像任务模式消费视图中进行消费。要创建您的外部模式，请使用以下语法，确保 DATABASE 属性是存储任务创建的数据库：

  CREATE EXTERNAL SCHEMA &lt;local\_schema\_name&gt;  
  FROM DATA CATALOG  
  DATABASE '&lt;database\_name&gt;'  
  IAM\_ROLE 'arn:aws:iam::&lt;AWS account-id&gt;:role/&lt;role-name&gt;'  
  REGION '&lt;aws-region&gt;'

#### Snowflake

* 与您要镜像数据的数据仓库数据库的连接。或者，您可以在创建镜像任务期间创建新连接。有关详细信息，请参阅 [Snowflake](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/TargetConnections/snowflake-target.htm)。

* Snowflake 外部卷。这授予 Snowflake 对您的 S3 位置的受限访问权限。要配置该卷，请参阅 [为 Amazon S3 配置外部卷](https://docs.snowflake.com/en/user-guide/tables-iceberg-configure-external-volume-s3)。

* AWS Glue Data Catalog 集成。这使 Snowflake 能够连接到对象存储中以 Iceberg 开放表格式保存的数据。要配置目录集成，请参阅 [为 AWS Glue 配置目录集成](https://docs.snowflake.com/en/user-guide/tables-iceberg-configure-catalog-integration-glue)。

#### Databricks

* 与您要镜像数据的 Databricks 工作区的连接。或者，您可以在创建镜像任务期间创建新连接。有关详细信息，请参阅 [Databricks](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/TargetConnections/databricks-target.htm)。

* 在创建镜像任务之前，必须在 AWS 和 Databricks 中配置以下对象：

  * AWS 中的 Glue 连接。这使 Databricks 能够通过 AWS Glue Data Catalog 联合元数据查询。有关详细信息，请参阅 [AWS Glue > 连接到数据](https://docs.aws.amazon.com/glue/latest/dg/glue-connections.html)。

  * Databricks Unity Catalog 中与 AWS 链接的服务凭据。这会授予 Databricks 访问 AWS 服务所需的权限。有关详细信息，请参阅 [Databricks > 创建服务凭据](https://docs.databricks.com/aws/en/connect/unity-catalog/cloud-services/service-credentials)。

  * Databricks Unity Catalog 中指向您的 S3 存储段的外部位置。这会授权 Databricks 读取由存储任务管理的 S3 路径上的 Iceberg 数据。有关详细信息，请参阅 [Databricks > 外部位置](https://docs.databricks.com/aws/en/connect/unity-catalog/cloud-storage#external-locations)。

  * Databricks Unity Catalog 中的外部目录。这会将注册在 AWS Glue 中的 Iceberg 表公开为 Databricks 中的可查询表。有关详细信息，请参阅 [Databricks > 外部目录](https://docs.databricks.com/aws/en/query-federation/foreign-catalogs)。

## 创建镜像数据任务

要将数据镜像到您的数据仓库，请执行以下操作：

1. 打开包含您要镜像的数据的存储任务的项目。

2. 单击存储任务上的 the 更多操作 icon 。选择 镜像数据，并进行配置：

   * 名称：输入镜像任务的名称。

   * 描述：（可选）描述任务的目的。

   * 数据仓库：选择您的目标数据仓库。

   * 连接：

     * 要使用现有连接，请单击 选择 以打开 安全源连接 对话框。选择您的连接所在的 空间，然后选择该连接。单击 编辑 以修改连接属性。

     * 要创建新连接，请单击 创建连接 以打开 创建连接 对话框，并按照说明进行操作。

   * 数据库：输入您要镜像数据的数据库名称。

   * 要镜像到 Amazon Redshift：

     * 外部模式：输入将在其中创建视图的模式名称。

       信息注释Amazon Redshift 中的所有表和视图名称都会转换为小写。

   * 要镜像到 Snowflake：

     * Snowflake 外部卷：输入在 Snowflake 中创建的外部卷名称。

     * Snowflake 目录集成：输入在 Snowflake 中创建的目录集成名称。

     * 选择您希望如何在 Snowflake 中刷新数据：

       * Qlik 托管：如果您想要创建下游转换，请选择此选项。这需要激活的 Snowflake 仓库，并由 Qlik 进行监控。

       * Snowflake 托管：当您不想执行下游转换时，请选择此选项。不需要 Snowflake 仓库，因此不受 Qlik 监控。这在 Snowflake 中进行管理 and 监控。

   * 要镜像到 Databricks：

     * Databricks 目录：输入 Databricks Unity Catalog 的名称。这通常是 hive\_metastore。

     * Databricks 外部目录：输入连接到 AWS Glue 的 Databricks 外部目录的名称。

3. 单击 确定 以创建镜像任务并将其添加到管道中的存储任务。

4. 单击镜像任务上的 the 更多操作 icon ，然后选择 打开。确保您显示的是 设计 视图。

5. 要选择可用数据集的子集，请单击 选择源数据 并删除任何不需要的数据集。

6. 单击 准备 以创建外部对象并镜像数据。

## 执行转换

如果您需要转换数据，可以创建一个 Redshift、Snowflake 或 Databricks 项目，并使用 Qlik 开放式湖空间 项目中的镜像数据任务作为源。镜像任务源必须与项目使用相同的云数据仓库平台。例如，当您创建 Amazon Redshift 项目以执行转换时，必须使用 Amazon Redshift 镜像数据任务作为源。

信息注释要使用现有项目中的数据创建转换任务，请参阅 [构建跨项目管道](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DataIntegration/Introduction/Data-projects.htm)。

## 查看任务信息

点击菜单栏上的 the 信息 icon 以查看任务信息，例如：

* 所有者

* 空间

* 数据平台

* 项目 ID

* 数据任务运行时 ID

## 删除镜像数据任务

当您删除镜像任务时，由该镜像任务创建的内部模式和视图将被删除。Redshift 中的外部模式和表不会被删除。如果从 AWS Glue 中删除了表（例如，当用户在存储中删除数据集或删除整个存储任务时），该更改将自动反映在 Redshift 外部模式中。该表已被移除，无需单独删除。作为最佳实践，如果不再使用外部模式，请将其完全删除。

信息注释当您删除 Databricks 镜像任务时，Databricks 中的外部目录和外部位置不会被删除。如果不再需要，请在 Databricks 中手动删除这些内容。

信息注释当镜像任务正在从中读取数据时，无法删除存储任务。

要删除镜像数据任务，请执行以下操作：

1. 在您要删除的镜像数据任务上，单击该任务上的 the 更多操作 icon 菜单，然后选择 删除。

2. 在确认对话框中，单击 删除。