为 Snowflake 设置增量转移

本指南介绍如何配置从 Snowflake 到 BigQuery 的增量数据传输。增量转移功能可让您仅转移自上次转移运行以来发生变化的数据,从而缩短转移时间并降低费用。

增量转移限制

增量 Snowflake 转移作业受到以下限制:

  • 您必须提供主键列才能使用 upsert 写入模式。如需了解详情,请参阅为增量转移定义主键
  • 主键在源表中必须是唯一的。如果存在重复项,BigQuery 中合并操作的结果可能会不一致,并且与源数据不匹配。
  • 不支持通过增量转移自动处理架构变更。如果源表的架构发生变化,您必须手动更新 BigQuery 表架构。
  • 当源数据中的更改集中在少量分区中时,增量转移的效果最佳。如果更新分散在源表的各个位置,增量传输性能可能会大幅下降,因为这需要扫描许多分区。如果数据传输之间有很多行发生了更改,建议您改用完整传输。
  • Snowflake 中的某些操作(例如 CREATE OR REPLACE TABLECLONE)可能会覆盖原始表对象及其关联的更改跟踪历史记录。这会导致现有数据转移过时,并且需要进行新的完整同步才能恢复增量转移。
  • 增量传输必须以足够的频率运行,才能在 Snowflake 的数据保留期限内进行变更跟踪。如果上次成功转移是在此时间窗口之外运行的,则下一次转移将是完整转移。

数据注入行为

设置 Snowflake 转移作业时,您可以在转移作业配置中选择完整增量写入偏好设置,以指定数据加载到 BigQuery 的方式。预览版支持增量转移。

您可以配置完整数据转移,以便在每次数据转移时转移 Snowflake 数据集中的所有数据。

或者,您也可以配置增量数据转移(预览版),以仅转移自上次数据转移以来更改的数据,而不是在每次数据转移时都加载整个数据集。如果您为数据转移选择增量,则必须指定附加upsert 写入模式,以定义在增量数据转移期间如何将数据写入 BigQuery。以下各部分介绍了可用的写入模式。

附加写入模式

附加写入模式只会向目标表中插入新行。此选项会严格附加转移的数据,而不检查是否存在现有记录,因此这种模式可能会导致目标表中的数据重复。

选择附加模式时,您必须选择水位线列。Snowflake 连接器需要一个水位线列来跟踪源表中的更改。

对于 Snowflake 转移,我们建议选择仅在创建记录时更新的列,且该列不会随后续更新而变化。例如,CREATED_AT 列。

Upsert 写入模式

upsert 写入模式会通过检查主键来更新目标表中的行或在其中插入新行。您可以指定主键,以便 Snowflake 连接器确定需要进行哪些更改才能使目标表与源表保持同步。如果在数据转移期间,指定的主键存在于目标 BigQuery 表中,则 Snowflake 连接器会使用源表中的新数据更新该行。如果在数据转移期间不存在主键,则 Snowflake 连接器会插入新行。

选择更新/插入模式时,您必须选择水位线列和主键:

  • Snowflake 连接器需要一个水位线列来跟踪源表中的更改。
    • 选择一个每次修改行时都会更新的水位线列。我们建议使用与 UPDATED_ATLAST_MODIFIED 列类似的列。
  • 主键可以是表中的一列或多列,Snowflake 连接器需要使用这些列来确定是否需要插入或更新行。

    选择包含非 null 值且在表的所有行中都唯一的列。我们建议使用包含系统生成的标识符、唯一参考代码(例如自动递增的 ID)或不可变、基于时间的序列 ID 的列。

    为防止潜在的数据丢失或数据损坏,您选择的主键列必须具有唯一值。如果您对所选主键列的唯一性有疑问,建议您改用附加写入模式。

如需将 upsert 写入模式与增量数据传输搭配使用,您必须在自定义架构文件中定义主键

增量提取行为

当您更改数据源中的表架构时,这些表中的增量数据转移会在 BigQuery 中以以下方式反映出来:

数据源变更 增量提取行为
添加新列 系统会在目标 BigQuery 表中添加一个新列。 此列的所有先前记录都将具有 null 值。
删除列 已删除的列仍保留在目标 BigQuery 表中。系统会使用 null 值填充此已删除列的新条目。
更改列中的数据类型 该连接器仅支持 ALTER COLUMN DDL 语句支持的数据类型转换。 任何其他数据类型转换都会导致数据转移失败。

如果您遇到任何问题,建议您创建新的转移配置。

重命名列 原始列会按原样保留在目标 BigQuery 表中,同时系统会向目标表添加一个具有更新名称的新列。

用于增量转移的自定义架构文件

您可以使用自定义架构文件来定义增量传输的主键,并自定义架构映射。自定义架构文件是一个描述源架构和目标架构的 JSON 文件。

对于 Upsert 模式下的增量转移,您必须将一列或多列标识为主键。为此,请在自定义架构文件中使用 PRIMARY_KEY 使用类型标注列。

以下示例展示了一个自定义架构文件,该文件将 O_ORDERKEYO_ORDERDATE 定义为 orders 表的主键:


{
  "databases": [
    {
      "name": "my_db",
      "originalName": "my_db",
      "tables": [
        {
          "name": "orders",
          "originalName": "orders",
          "columns": [
            {
              "name": "O_ORDERKEY",
              "originalName": "O_ORDERKEY",
              "usageType": [
                "PRIMARY_KEY"
              ]
            },
            {
              "name": "O_ORDERDATE",
              "originalName": "O_ORDERDATE",
              "usageType": [
                "PRIMARY_KEY"
              ]
            }
          ]
        }
      ]
    }
  ]
}

启用更改跟踪

在设置增量 Snowflake 转移之前,您必须使用以下命令在每个源表上启用更改跟踪:

ALTER TABLE DATABASE_NAME.SCHEMA_NAME.TABLE_NAME SET CHANGE_TRACKING = TRUE;

如果未为表启用更改跟踪,则 Snowflake 连接器默认对该表执行完整数据转移。

后续步骤

配置完增量 Snowflake 转移所需的所有步骤后,您可以为 Snowflake 转移配置启用增量转移。如需了解详情,请参阅设置 Snowflake 转移