从 Snowflake 迁移到 BigQuery

本文档提供了有关如何将数据从 Snowflake 迁移到 BigQuery 的技术信息。文中介绍了 Snowflake 与 BigQuery 之间的基本差异,还提供了成功迁移的指导,例如:

  • 需要进行哪些架构更改
  • 可以使用哪些迁移工具和选项
  • 如何迁移数据(使用示例导出过程)

您还可以使用批量 SQL 转换来批量迁移 SQL 脚本,或使用交互式 SQL 转换来转换临时查询。两个预览版的工具都支持 Snowflake SQL。

术语

本文档使用 Snowflake 和 BigQuery 术语来描述每个产品提供的功能。下表将 Snowflake 术语与等价的 BigQuery 术语一一对应:

Snowflake BigQuery
数据库 数据集
架构 架构
特定于会话的临时或暂时表 匿名表或临时表
视图 视图
安全视图 已获授权的视图
虚拟仓库 预订
物化视图 物化视图
没有分区的等价术语(因为使用微分区 [micro-partitioning] 分区
聚簇 聚簇
安全增强型用户定义函数 (UDF) 已获授权的 UDF

架构比较

Snowflake 和 BigQuery 都是分析数据仓库,但它们在架构方面存在一些主要差异。

Snowflake 的架构是共享磁盘数据库架构和无共享数据库架构的混合。就无共享架构来说,Snowflake 中的数据会在单独的云对象存储服务中进行管理;而就共享磁盘架构来说,Snowflake 中的查询会使用专用的计算集群。在 Snowflake 中,每个集群都会管理整个数据集的一些缓存部分,以加快查询速度。如需了解详情,请参阅 Snowflake 架构

BigQuery 的架构与基于节点的云数据仓库解决方案或 MPP 系统截然不同。它将存储和计算分离,使两者可以独立地按需扩缩。如需了解详情,请参阅 BigQuery 底层探秘

界面比较

Snowflake 网页界面与 Snowflake 命令行界面 (CLI) 对应。这两个界面都允许您执行以下操作:

  • 管理数据库
  • 管理仓库
  • 管理查询和工作表
  • 查看历史查询

在网页界面中,您还可以管理 Snowflake 密码和用户偏好设置。

Snowflake CLI 客户端使用 SnowSQL 连接到 Snowflake 以运行 SQL 查询和其他操作。

BigQuery 界面内置在 Google Cloud 控制台中并包含您可以查看的 BigQuery 资源的列表:

  • BigQuery Studio 部分会显示您的数据集、表、视图和其他 BigQuery 资源。您可以在此处创建和运行查询、使用表和视图、查看 BigQuery 作业记录,以及执行其他常见的 BigQuery 任务。
  • 点击数据传输部分会打开 BigQuery Data Transfer Service 页面。
  • 计划查询部分显示您已计划的查询。
  • 容量管理部分显示槽承诺、预留和预留分配。
  • 点击 BI Engine 部分会打开 BigQuery BI Engine 页面。

BigQuery 还具有一个基于 Python 的命令行工具。如需了解详情,请参阅使用 bq 命令行工具

安全

从 Snowflake 迁移到 BigQuery 时,您必须考虑 Google Cloud 处理安全性的一般方式以及 BigQuery 处理安全性的特殊方式与 Snowflake 的不同之处。

Snowflake 具有各种安全相关功能,包括:

  • 网络和网站访问
  • 账号和用户身份验证
  • 对象安全
  • 数据安全
  • 安全验证

Snowflake 的安全性基于您的云服务商的功能。它允许您精细控制对象访问权限、对象操作以及谁可以创建或更改访问权限控制政策。

与 Snowflake 中的访问权限控制相同的 BigQuery 机制是 Google Cloud 中的 Identity and Access Management (IAM) 角色。这些权限决定了可以对资源执行的操作。权限在 Google Cloud 级层强制执行。

加密

在 Snowflake 中,Enterprise 版本支持列级安全性,Business Critical 版本支持客户管理的加密密钥。这些版本的价格不同。在 BigQuery 中,所有功能和增强型安全措施均作为标准功能提供,无需额外付费。

Snowflake 提供端到端加密功能,可自动加密所有存储的数据。Google Cloud 默认加密所有静态数据和传输中的数据,这提供了相同功能。

与 Snowflake Business Critical 版本类似,对于想要在 Cloud Key Management Service 中控制和管理密钥加密密钥的用户,BigQuery 支持客户管理的加密密钥。BigQuery 还允许使用列级加密。如需详细了解 Google Cloud 中的加密,请参阅 Google Cloud 中的静态加密Google Cloud 中的传输加密

角色

角色是可以向其授予和撤消可保护对象权限的实体。

Snowflake 支持两种类型的角色:

  • 系统定义的角色:这些角色由系统和安全相关权限组成,使用与账号管理相关的权限创建。
  • 自定义角色:您可以使用 SECURITYADMIN 角色或具有 CREATE ROLE 权限的任何角色来创建这些角色。Snowflake 中的每个自定义角色都由权限组成。

在 IAM 中,权限分组为角色。IAM 提供三种类型的角色:

  • 基本角色:包括 Owner、Editor 和 Viewer 角色。您可以使用 Google Cloud 控制台、Identity and Access Management API 或 gcloud CLI 在项目或服务资源级应用这些角色。通常,为了获得最强的安全性,我们建议您使用特定于 BigQuery 的角色,以遵循最小权限原则。
  • 预定义角色:这些角色提供对产品(例如 BigQuery)中功能的更精细的访问权限,旨在支持常见使用场景和访问权限控制模式。
  • 自定义角色:这些角色由用户指定的权限组成。

访问权限控制

Snowflake 允许您向角色授予其他角色,从而创建角色层次结构。IAM 不支持角色层次结构,但实现了资源层次结构。IAM 层次结构包括组织级层、文件夹级层、项目级层和资源级层。您可以在层次结构的任何级层设置 IAM 角色,资源会继承其父级资源的所有政策。

Snowflake 和 BigQuery 都支持表级访问权限控制。表级权限决定了可以访问表或视图的用户、群组和服务账号。您可以在无需向用户提供完整的数据集访问权限的情况下授权用户访问特定的表或视图。

Snowflake 还使用行级安全性列级安全性

在 BigQuery 中,IAM 提供表级访问权限控制。如需提供更精细的访问权限,您还可以使用列级访问权限控制行级安全性。这种控制类型通过使用政策标记或基于类型的数据分类,提供针对敏感列的细化访问权限。

您还可以创建授权视图来限制数据访问以实现更精细的访问权限控制,这样,只有指定用户可以查询视图,并且他们没有底层表的读取权限。

迁移时的注意事项

Snowfake 有几项功能无法直接移植到 BigQuery。例如,BigQuery 不提供对以下场景的内置支持。在这些场景下,您可能需要使用 Google Cloud 中的其他服务。

  • 时间旅行:在 BigQuery 中,您可以使用时间旅行功能访问过去 7 天内任何时间点的数据。如果您需要访问超过 7 天的数据,请考虑导出定期计划的快照。Snowfake 支持访问所定义时间段内任何时间点的历史数据(已更改或删除的数据)。您可以将此时间段设置为从 0 到 90 天的任何值。

  • 数据流:BigQuery 支持使用 Datastream 进行变更数据捕获 (CDC)。您还可以使用 Debezium 等 CDC 软件,通过 Dataflow 将记录写入 BigQuery。如需详细了解如何使用 BigQuery 手动设计 CDC 流水线,请参阅将数据仓库迁移到 BigQuery:变更数据捕获 (CDC)。在 Snowflake 中,流对象会记录对表进行的数据操纵语言更改以及关于每项更改的元数据,以便您对更改的数据执行操作。

  • 任务:BigQuery 允许您使用 Datastream 计划查询和数据流或将集成流式传输到查询中。Snowflake 可将任务与表流相结合,持续提取、加载和转移工作流以处理最近更改的表行。

  • 外部函数:BigQuery 支持通过 Cloud Run functions 调用外部函数。不过,您也可以使用用户定义的函数 (UDF),例如 SQL UDF。但这些函数不会在 BigQuery 之外执行。在 Snowflake 中,外部函数会调用在 Snowflake 外部运行的代码。例如,发送到远程服务的信息通常通过代理服务进行中继。

将数据从 Snowflake 迁移到 BigQuery

本部分介绍如何根据将数据仓库迁移到 BigQuery:迁移的内容和方式中说明的框架,配置并启动从 Snowflake 到 BigQuery 的迁移。

架构

要开始迁移,您需要同时运行 Snowflake 和 BigQuery。下图展示了对现有操作影响最小的架构。通过转移干净且质量可控的数据,您可以在将工作负载分流到 BigQuery 时重复利用现有的工具和流程。您还可以根据旧版本验证报告和信息中心。不过,由于 OLAP 数据保留在冗余位置,因此此操作不具备成本效益。这也会延长处理时间。

  • 点 1 显示数据从 Snowflake 移动到 Cloud Storage。
  • 点 2 显示将数据持久保存到 BigQuery 中。
  • 点 3 显示如何向最终用户发送数据。

您可以根据旧版迭代验证报告和信息中心。如需了解详情,请参阅将数据仓库迁移到 BigQuery:验证和确认

从 Snowflake 持续迁移到 BigQuery。

数据仓库迁移的最终架构将来自源系统的所有数据直接保留在 Google Cloud 中。根据源系统的数量和复杂性,可以根据优先级、相互依赖性、集成风险或其他业务因素,以一次一个的速度处理源系统以进一步分阶段交付此架构。

下图展示了数据流水线的迁移和注入 Google Cloud。

  • 点 1 显示同步集成点和异步集成点。例如,在处理流程中需要显式用户操作的使用场景时,数据源与 App Engine 之间是同步集成。
  • 点 2 显示使用 Pub/Sub 处理大量并发事件数据。
  • 点 3 显示使用一个或多个 Google Cloud 产品持久保存数据(具体取决于数据的性质)。
  • 点 4 显示到 BigQuery 的提取、转换和加载 (ETL) 流程。

迁移后的 Snowflake to BigQuery。

准备 Cloud Storage 环境

Google Cloud 提供了几种使用其他 ETL 工具将数据转移到 BigQuery 的方法。模式如下:

  1. 从来源提取数据:将从来源提取的文件复制到本地环境中的暂存存储空间。如需了解详情,请参阅将数据仓库迁移到 BigQuery:提取源数据

  2. 将数据转移到暂存 Cloud Storage 存储桶:从来源提取完数据后,将数据转移到 Cloud Storage 中的临时存储桶。根据要转移的数据量和可用的网络带宽,您有几个选项

    请务必确保 BigQuery 数据集的位置和外部数据源,或 Cloud Storage 存储桶位于相同区域。如需详细了解从 Cloud Storage 加载数据的地理位置注意事项,请参阅批量加载数据

  3. 将数据从 Cloud Storage 存储桶加载到 BigQuery:您的数据现在位于 Cloud Storage 存储桶中,更靠近其目标。将数据上传到 BigQuery 有多个选项可用。这些选项取决于需要的数据转换程度。或者,您可以按照 ETL 方法在 BigQuery 中转换数据。

    当您从 JSON 文件、Avro 文件或 CSV 文件批量导入数据时,BigQuery 会自动检测架构,您无需预定义架构。如需详细了解 EDW 工作负载的架构迁移过程,请参阅架构和数据迁移过程

支持的数据类型、属性和文件格式

Snowflake 和 BigQuery 支持的数据类型大部分相同,但有时使用不同的名称。如需查看 Snowflake 和 BigQuery 中支持的数据类型的完整列表,请参阅 Snowflake SQL 转换参考数据类型部分。您还可以使用批量 SQL 转换器进行转换。如需详细了解 BigQuery 支持的数据类型,请参阅 GoogleSQL 数据类型

Snowflake 可以导出以下文件格式的数据。您可以将格式直接加载到 BigQuery 中:

架构更改

如果您计划在迁移到 BigQuery 时更改架构,我们建议您先按原样迁移架构。BigQuery 支持各种数据模型设计模式,例如星型架构雪花型架构。由于有这样的支持,您无需更新上游数据流水线以获得新架构,并且可以使用自动化迁移工具转移数据和架构。

更新架构

数据进入 BigQuery 后,您可以随时更新架构,例如在架构定义中添加列或将列的模式从 REQUIRED 放宽到 NULLABLE

请注意,对于表名称,BigQuery 使用区分大小写的命名惯例,而 Snowflake 使用不区分大小写的命名模式。这意味着您可能需要重新检查 Snowflake 中是否有不一致的表命名惯例,并在迁移到 BigQuery 期间纠正出现的所有不一致问题。如需详细了解架构修改,请参阅修改表架构

某些架构修改在 BigQuery 中不受直接支持,需要手动解决方法,包括:

  • 更改列的名称。
  • 更改列的数据类型。
  • 更改列的模式(将 REQUIRED 列放宽为 NULLABLE 除外)。

如需了解手动更改架构的具体说明,请参阅手动更改表架构

优化

架构迁移后,您可以测试性能并根据结果进行优化。例如,您可以引入分区来提高数据的管理和查询效率。BigQuery 中的分区是指一种特殊的表,它分成多个区段(称为分区)。分区与 Snowflake 中的微分区不同,后者在加载数据时自动进行。在 BigQuery 中,您可以按注入时间、时间戳或整数范围进行分区,从而改善查询性能和费用控制。如需了解详情,请参阅分区表简介

聚簇表

聚簇表是另一项架构优化。与 Snowflake 一样,BigQuery 允许您对表进行聚簇,从而根据表架构中一个或多个列的内容自动组织表数据。BigQuery 使用您指定的列来共置相关数据。聚簇可以提高某些类型的查询的性能,例如,使用过滤条件子句的查询或汇总数据的查询。如需详细了解聚簇表在 BigQuery 中的工作原理,请参阅聚簇表简介

迁移工具

以下列表介绍了可用于将数据从 Snowflake 迁移到 BigQuery 的工具。使用流水线进行迁移的示例部分将组合使用这些工具来构建端到端迁移流水线。

  • COPY INTO <location> 命令:在 Snowflake 中使用此命令,将数据从 Snowflake 表直接卸载到指定的 Cloud Storage 存储桶中。如需查看端到端示例,请参阅 GitHub 上的 Snowflake to BigQuery (snowflake2bq)
  • Apache Sqoop:如需将数据从 Snowflake 提取到 HDFS 或 Cloud Storage 中,请使用 Sqoop 和 Snowflake 的 JDBC 驱动程序提交 Hadoop 作业。Sqoop 在 Dataproc 环境中运行。
  • Snowflake JDBC:将此驱动程序与大多数支持 JDBC 的客户端工具或应用搭配使用。

您可以使用以下通用工具将数据从 Snowflake 迁移到 BigQuery:

  • BigQuery Data Transfer Service:使用此全代管式服务将 Cloud Storage 数据自动批量转移到 BigQuery。要使用此工具,您需要先将 Snowflake 数据导出到 Cloud Storage。
  • The Google Cloud CLI:使用此命令行工具将下载的 Snowflake 文件复制到 Cloud Storage 中。
  • bq 命令行工具:使用此命令行工具与 BigQuery 进行交互。常见用例包括创建 BigQuery 表架构、将 Cloud Storage 数据加载到表中以及运行查询。
  • Cloud Storage 客户端库:通过使用 Cloud Storage 客户端库的自定义工具将下载的 Snowflake 文件复制到 Cloud Storage。
  • BigQuery 客户端库:使用基于 BigQuery 客户端库构建的自定义工具与 BigQuery 进行交互。
  • BigQuery 查询调度器:使用此内置 BigQuery 功能安排周期性 SQL 查询。
  • Cloud Composer:使用此全代管式 Apache Airflow 环境编排 BigQuery 加载作业和转换。

如需详细了解如何将数据加载到 BigQuery 中,请参阅将数据加载到 BigQuery 中

使用流水线进行迁移的示例

以下部分展示了如何使用三种不同的技术将数据从 Snowflake 迁移到 BigQuery:提取和加载、ETL 以及合作伙伴工具。

提取和加载

提取和加载技术提供两种方法:

  • 使用流水线从 Snowflake 卸载数据
  • 使用流水线和 JDBC 驱动程序从 Snowflake 导出数据

使用流水线从 Snowflake 卸载数据

如需将数据从 Snowflake 直接卸载到 Cloud Storage(推荐),或者下载数据并使用 gcloud CLI 或 Cloud Storage 客户端库将数据复制到 Cloud Storage,请使用 snowflake2bq 工具通过 Snowflake COPY INTO <location> 命令迁移数据。

然后,您可以使用以下任一工具将 Cloud Storage 数据加载到 BigQuery 中:

  • BigQuery Data Transfer Service
  • bq 命令行工具
  • BigQuery API 客户端库

使用流水线和 JDBC 驱动程序从 Snowflake 导出数据

使用以下任意产品通过 Snowflake 的 JDBC 驱动程序导出 Snowflake 数据:

提取、转换和加载

如果您希望在将数据加载到 BigQuery 之前转换数据,则可以在上文提取和加载部分所述的流水线中添加一个转换步骤。

转换 Snowflake 数据

如需在将数据加载到 BigQuery 之前转换数据,您可以将数据直接从 Snowflake 卸载到 Cloud Storage,也可以使用 gcloud CLI 复制数据,如上文提取和加载部分所述。

加载 Snowflake 数据

转换数据后,您可以使用以下方法之一将数据加载到 BigQuery 中:

使用流水线和 JDBC 驱动程序转换数据并从 Snowflake 导出

如上文提取和加载部分所述,在下面的流水线选项中添加一个转换步骤。

您可能有一个提取、加载和转换用例,用于将数据从 Snowflake 加载到 BigQuery,然后对其进行转换。如需执行此任务,请使用上文提取和加载部分所述方法之一,将数据从 Snowflake 加载到 BigQuery 暂存表中。然后,在暂存表上运行 SQL 查询,并将输出写入 BigQuery 中的最终生产表。

用于迁移的合作伙伴工具

有许多供应商专门提供 EDW 迁移空间。如需查看主要合作伙伴及其提供的解决方案的列表,请参阅 Google Cloud 的 BigQuery 合作伙伴网站

导出过程示例

以下部分展示了使用 COPY INTO <location> Snowflake 命令将数据从 Snowflake 导出到 BigQuery 的示例。如需查看包含代码示例的详细分步过程,请参阅 Google Cloud 专业服务 Snowflake to BigQuery 工具

准备导出

对于卸载,请使用 Snowflake SQL 语句创建一个命名的文件格式规范

本教程使用 my_parquet_unload_format 作为文件格式,但您可以使用其他名称。

   create or replace file format my_parquet_unload_format
     type = 'PARQUET'
     field_delimiter = '|'

导出 Snowflake 数据

准备好数据后,您需要将数据移动到 Google Cloud。您可以通过以下两种方式之一执行此步骤:

  1. 将数据从 Snowflake 直接导出到 Cloud Storage。
  2. 将 Snowflake 数据暂存在 Amazon Simple Storage Service (Amazon S3) 存储桶或 Azure Blob Storage 中。

要避免额外的数据跃迁,请直接导出数据。

将 Snowflake 数据直接导出到 Cloud Storage

以下说明展示了如何使用 Snowflake COPY 命令将数据从 Snowflake 卸载到 Cloud Storage:

  1. 在 Snowflake 中配置存储集成对象,以允许 Snowflake 写入外部 Cloud Storage 暂存区中引用的 Cloud Storage 存储桶。

    此步骤涉及多个子步骤。

    1. 使用 CREATE STORAGE INTEGRATION 命令创建一个集成:

      create storage integration gcs_int
        type = external_stage
        storage_provider = gcs
        enabled = true
        storage_allowed_locations = ('gcs://mybucket/unload/')
      
    2. 使用 DESCRIBE INTEGRATION 命令检索 Snowflake 的 Cloud Storage 服务账号,并授权该服务账号访问被选为暂存区域的 Cloud Storage 存储桶:

      desc storage integration gcs_int;
      
      +-----------------------------+---------------+-----------------------------------------------------------------------------+------------------+
      | property                    | property_type | property_value                                                              | property_default |
      +-----------------------------+---------------+-----------------------------------------------------------------------------+------------------|
      | ENABLED                     | Boolean       | true                                                                        | false            |
      | STORAGE_ALLOWED_LOCATIONS   | List          | gcs://mybucket1/path1/,gcs://mybucket2/path2/                               | []               |
      | STORAGE_BLOCKED_LOCATIONS   | List          | gcs://mybucket1/path1/sensitivedata/,gcs://mybucket2/path2/sensitivedata/   | []               |
      | STORAGE_GCP_SERVICE_ACCOUNT | String        | service-account-id@project1-123456.iam.gserviceaccount.com                  |                  |
      +-----------------------------+---------------+---------------------------------------------------------
      --------------------+------------------+
      
    3. 创建一个外部 Cloud Storage 暂存区,该暂存区引用您使用 CREATE STAGE 命令创建的集成:

      create or replace stage my_ext_unload_stage
        url='gcs://mybucket/unload'
        storage_integration = gcs_int
        file_format = my_parquet_unload_format;
      
  2. 使用 COPY INTO <location> 命令并指定您在上一步中创建的外部暂存区对象,以将数据从 Snowflake 数据库表复制到 Cloud Storage 存储桶:

    copy into @my_ext_unload_stage/d1
    from mytable;
    

通过 Storage Transfer Service 将 Snowflake 数据从 Amazon S3 导出到 Cloud Storage

以下示例展示了如何使用 COPY 命令将 Snowflake 表中的数据卸载到 Amazon S3 存储桶

  1. 在 Snowflake 中配置存储集成对象,以允许 Snowflake 写入外部 Cloud Storage 暂存区中引用的 Amazon S3 存储桶。

    此步骤涉及配置对 Amazon S3 存储桶的访问权限创建 AWS IAM 角色以及使用 CREATE STORAGE INTEGRATION 命令在 Snowflow 中创建存储集成:

    create storage integration s3_int
      type = external_stage
      storage_provider = s3
      enabled = true
      storage_aws_role_arn = 'arn:aws:iam::001234567890:role/myrole'
      storage_allowed_locations = ('s3://unload/files/')
    
  2. 使用 DESCRIBE INTEGRATION 命令检索 AWS IAM 用户

    desc integration s3_int;
    
    +---------------------------+---------------+================================================================================+------------------+
    | property                  | property_type | property_value                                                                 | property_default |
    +---------------------------+---------------+================================================================================+------------------|
    | ENABLED                   | Boolean       | true                                                                           | false            |
    | STORAGE_ALLOWED_LOCATIONS | List          | s3://mybucket1/mypath1/,s3://mybucket2/mypath2/                                | []               |
    | STORAGE_BLOCKED_LOCATIONS | List          | s3://mybucket1/mypath1/sensitivedata/,s3://mybucket2/mypath2/sensitivedata/    | []               |
    | STORAGE_AWS_IAM_USER_ARN  | String        | arn:aws:iam::123456789001:user/abc1-b-self1234                                 |                  |
    | STORAGE_AWS_ROLE_ARN      | String        | arn:aws:iam::001234567890:role/myrole                                          |                  |
    | STORAGE_AWS_EXTERNAL_ID   | String        | MYACCOUNT_SFCRole=                                                   |                  |
    +---------------------------+---------------+================================================================================+------------------+
    
  3. 向 AWS IAM 用户授予 Amazon S3 存储桶的访问权限,并使用 CREATE STAGE 命令创建外部暂存区。

      create or replace stage my_ext_unload_stage url='s3://unload/files/'
        storage_integration = s3_int
        file_format = my_parquet_unload_format;
    
  4. 使用 COPY INTO <location> 命令并指定您之前创建的外部暂存区对象,以将数据从 Snowflake 数据库复制到 Amazon S3 存储桶:

      copy into @my_ext_unload_stage/d1 from mytable;
    
  5. 使用 Storage Transfer Service 将导出的文件转移到 Cloud Storage。

通过其他云服务商将 Snowflake 数据导出到 Cloud Storage:

Azure Blob Storage。按照卸载到 Microsoft Azure 中详细介绍的步骤操作。然后,使用 Storage Transfer Service 将导出的文件转移到 Cloud Storage。

Amazon S3 存储桶。按照卸载到 Amazon S3 中详细介绍的步骤操作。然后,使用 Storage Transfer Service 将导出的文件转移到 Cloud Storage。

后续步骤