Snowflake 的架构检测和映射

本指南介绍了在将数据从 Snowflake 转移到 BigQuery 时如何定义架构。您可以使用 BigQuery Data Transfer Service 自动检测架构和数据类型映射,也可以使用转换引擎手动定义架构和数据类型。

启用自动默认架构检测

Snowflake 连接器可以自动检测 Snowflake 表架构。如需使用自动架构检测功能,您可以在设置 Snowflake 转移时将翻译输出 GCS 路径字段留空。

以下列表显示了 Snowflake 连接器如何将 Snowflake 数据类型映射到 BigQuery:

  • 以下数据类型在 BigQuery 中映射为 STRING
    • TIMESTAMP_TZ
    • TIMESTAMP_LTZ
    • OBJECT
    • VARIANT
    • ARRAY
  • 以下数据类型在 BigQuery 中映射为 TIMESTAMP
    • TIMESTAMP_NTZ

所有其他 Snowflake 数据类型都直接映射到 BigQuery 中的等效类型。

使用翻译引擎输出手动定义架构

在将 Snowflake 表迁移到 BigQuery 时,适用于 Snowflake 的 BigQuery Data Transfer Service 连接器会使用 BigQuery 迁移服务转换引擎进行架构映射。

如需手动定义架构(例如,替换某些架构属性),您可以生成元数据,然后运行翻译引擎。

限制

  • 从 Snowflake 提取数据时,数据采用 Parquet 数据格式,然后加载到 BigQuery 中:

    • 不支持以下 Parquet 数据类型:
    • 不支持以下 Parquet 数据类型,但可以转换:

      • TIMESTAMP_NTZ
      • OBJECTVARIANTARRAY

      在运行转换引擎时,使用全局类型转换配置 YAML 替换这些数据类型的默认行为。

      配置 YAML 可能类似于以下示例:

      type: experimental_object_rewriter
      global:
        typeConvert:
          datetime: TIMESTAMP
          json: VARCHAR
      

所需的服务账号权限

在 Snowflake 转移中,服务账号用于从指定的 Cloud Storage 路径中的转换引擎输出读取数据。您必须向该服务账号授予 storage.objects.getstorage.objects.list 权限。

我们建议该服务账号属于在其中创建转移作业配置和目标数据集的同一 Google Cloud 项目。如果服务账号属于与创建 BigQuery 数据转移作业的项目不同的 Google Cloud 项目,则您必须启用跨项目服务账号授权

如需了解详情,请参阅 BigQuery IAM 角色和权限

手动定义架构映射

您可以按照以下步骤手动定义架构映射:

  1. 运行适用于 Snowflake 的 dwh-migration-tool。如需了解详情,请参阅生成元数据以进行转换和评估
  2. 将生成的 metadata.zip 文件上传到 Cloud Storage 存储桶。metadata.zip 文件用作转换引擎的输入。
  3. 运行批量翻译服务,并将 target_types 字段指定为 metadata。如需了解详情,请参阅使用 Translation API 转换 SQL 查询

    • 以下是针对 Snowflake 运行批量翻译的命令示例:
      curl -d "{
      \"name\": \"sf_2_bq_translation\",
      \"displayName\": \"Snowflake to BigQuery Translation\",
      \"tasks\": {
          string: {
            \"type\": \"Snowflake2BigQuery_Translation\",
            \"translation_details\": {
                \"target_base_uri\": \"gs://sf_test_translation/output\",
                \"source_target_mapping\": {
                  \"source_spec\": {
                      \"base_uri\": \"gs://sf_test_translation/input\"
                  }
                },
                \"target_types\": \"metadata\",
            }
          }
      },
      }" \
      -H "Content-Type:application/json" \
      -H "Authorization: Bearer TOKEN" -X POST https://bigquerymigration.googleapis.com/v2alpha/projects/project_id/locations/location/workflows
    
    • 您可以在 BigQuery 的 SQL 转换页面中查看此命令的状态。批量转换作业的输出存储在 gs://translation_target_base_uri/metadata/config/ 中。

自定义架构文件

如果您需要捕获表的重要信息(例如主键),否则此类信息可能会在迁移过程中丢失,建议您指定自定义架构。例如,在进行增量转移时,我们建议您指定自定义架构文件,以便后续转移中的数据在加载到 BigQuery 时得到正确分区。如果没有架构文件,BigQuery Data Transfer Service 会使用要转移的源数据自动应用表架构,因此有关主键和更改跟踪的所有信息都可能会丢失。

如果您需要在数据转移期间更改列名称或数据类型,自定义架构也会很有用。

自定义架构文件是一个描述数据库对象的 JSON 文件。架构包含一组数据库,每个数据库包含一组表,每个表包含一组列。每个对象都有一个 originalName 字段,指示 Snowflake 中的对象名称;以及一个 name 字段,指示 BigQuery 中该对象的目标名称。

列具有以下字段:

  • originalType:指示 Snowflake 中的列数据类型
  • type:指示 BigQuery 中相应列的目标数据类型。
  • usageType:有关系统使用列的方式的信息。支持以下使用类型:

    • DEFAULT:一个目标表中可以有多列标注此使用类型。DEFAULT 使用类型表示该列在源系统中没有特殊用途。这是默认值。
    • PRIMARY_KEY:您可以使用此使用类型在每个目标表中为列添加注解。使用 PRIMARY_KEY 使用类型可只将一个列标识为主键,或者在复合键的情况下,对多个列使用相同的使用类型可标识表的唯一实体。这些列与 COMMIT_TIMESTAMP 搭配使用,可提取自上次转移作业运行后创建或更新的行。

以下示例展示了一个自定义架构文件,用于将 my_db 数据库中名为 orders 的 Snowflake 表迁移到 BigQuery,将 O_ORDERKEY 列重命名为 ORDERKEY,并将 O_ORDERSTATUS 标识为主键。

{
  "databases": [
    {
      "name": "my_db",
      "originalName": "my_db",
      "tables": [
        {
          "name": "orders",
          "originalName": "orders",
          "columns": [
            {
              "name": "ORDERKEY",
              "originalName": "O_ORDERKEY",
              "type": "INT64",
              "originalType": "NUMERIC",
              "usageType": [
                "PRIMARY_KEY"
              ],
              "isRequired": true,
              "originalColumnLength": 4
            },
            {
              "name": "O_ORDERSTATUS",
              "originalName": "O_ORDERSTATUS",
              "type": "STRING",
              "originalType": "VARCHAR",
              "usageType": [
                "DEFAULT"
              ],
              "isRequired": true,
              "originalColumnLength": 1
            }
          ]
        }
      ]
    }
  ]
}