为 Snowflake 设置增量转移
本指南介绍如何配置从 Snowflake 到 BigQuery 的增量数据传输。增量转移功能可让您仅转移自上次转移运行以来发生变化的数据,从而缩短转移时间并降低费用。
增量转移限制
增量 Snowflake 转移作业受到以下限制:
- 您必须提供主键列才能使用 upsert 写入模式。如需了解详情,请参阅为增量转移定义主键。
- 主键在源表中必须是唯一的。如果存在重复项,BigQuery 中合并操作的结果可能会不一致,并且与源数据不匹配。
- 不支持通过增量转移自动处理架构变更。如果源表的架构发生变化,您必须手动更新 BigQuery 表架构。
- 当源数据中的更改集中在少量分区中时,增量转移的效果最佳。如果更新分散在源表的各个位置,增量传输性能可能会大幅下降,因为这需要扫描许多分区。如果数据传输之间有很多行发生了更改,建议您改用完整传输。
- Snowflake 中的某些操作(例如
CREATE OR REPLACE TABLE或CLONE)可能会覆盖原始表对象及其关联的更改跟踪历史记录。这会导致现有数据转移过时,并且需要进行新的完整同步才能恢复增量转移。 - 增量传输必须以足够的频率运行,才能在 Snowflake 的数据保留期限内进行变更跟踪。如果上次成功转移是在此时间窗口之外运行的,则下一次转移将是完整转移。
数据注入行为
在设置 Snowflake 转移作业时,您可以在转移作业配置中选择完整或增量写入偏好设置,以指定数据加载到 BigQuery 的方式。预览版支持增量转移。
您可以配置完整数据转移,以便在每次数据转移时转移 Snowflake 数据集中的所有数据。或者,您也可以配置增量数据转移(预览版),以仅转移自上次数据转移以来更改的数据,而不是在每次数据转移时都加载整个数据集。如果您为数据转移选择增量,则必须指定附加或 upsert 写入模式,以定义在增量数据转移期间如何将数据写入 BigQuery。以下各部分介绍了可用的写入模式。
附加写入模式
附加写入模式只会向目标表中插入新行。此选项会严格附加转移的数据,而不检查是否存在现有记录,因此这种模式可能会导致目标表中的数据重复。
选择附加模式时,您必须选择水位线列。Snowflake 连接器需要一个水位线列来跟踪源表中的更改。
对于 Snowflake 转移,我们建议选择仅在创建记录时更新的列,且该列不会随后续更新而变化。例如,CREATED_AT 列。
Upsert 写入模式
upsert 写入模式会通过检查主键来更新目标表中的行或在其中插入新行。您可以指定主键,以便 Snowflake 连接器确定需要进行哪些更改才能使目标表与源表保持同步。如果在数据转移期间,指定的主键存在于目标 BigQuery 表中,则 Snowflake 连接器会使用源表中的新数据更新该行。如果在数据转移期间不存在主键,则 Snowflake 连接器会插入新行。
选择更新/插入模式时,您必须选择水位线列和主键:
- Snowflake 连接器需要一个水位线列来跟踪源表中的更改。
- 选择一个每次修改行时都会更新的水位线列。我们建议使用与
UPDATED_AT或LAST_MODIFIED列类似的列。
- 选择一个每次修改行时都会更新的水位线列。我们建议使用与
主键可以是表中的一列或多列,Snowflake 连接器需要使用这些列来确定是否需要插入或更新行。
选择包含非 null 值且在表的所有行中都唯一的列。我们建议使用包含系统生成的标识符、唯一参考代码(例如自动递增的 ID)或不可变、基于时间的序列 ID 的列。
为防止潜在的数据丢失或数据损坏,您选择的主键列必须具有唯一值。如果您对所选主键列的唯一性有疑问,建议您改用附加写入模式。
如需将 upsert 写入模式与增量数据传输搭配使用,您必须在自定义架构文件中定义主键。
增量提取行为
当您更改数据源中的表架构时,这些表中的增量数据转移会在 BigQuery 中以以下方式反映出来:
| 数据源变更 | 增量提取行为 |
|---|---|
| 添加新列 | 系统会在目标 BigQuery 表中添加一个新列。 此列的所有先前记录都将具有 null 值。 |
| 删除列 | 已删除的列仍保留在目标 BigQuery 表中。系统会使用 null 值填充此已删除列的新条目。 |
| 更改列中的数据类型 | 该连接器仅支持
ALTER COLUMN DDL 语句支持的数据类型转换。
任何其他数据类型转换都会导致数据转移失败。
如果您遇到任何问题,建议您创建新的转移配置。 |
| 重命名列 | 原始列会按原样保留在目标 BigQuery 表中,同时系统会向目标表添加一个具有更新名称的新列。 |
用于增量转移的自定义架构文件
您可以使用自定义架构文件来定义增量传输的主键,并自定义架构映射。自定义架构文件是一个描述源架构和目标架构的 JSON 文件。
对于 Upsert 模式下的增量转移,您必须将一列或多列标识为主键。为此,请在自定义架构文件中使用 PRIMARY_KEY 使用类型标注列。
以下示例展示了一个自定义架构文件,该文件将 O_ORDERKEY 和 O_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 转移。