1. 概述
1.1 版本
FineDataLink版本 | 功能说明 |
---|---|
4.0.18 | 1)移除了「比对字段」 2)写入方式「直接将数据写入目标表」,更新为「追加写入数据」 |
4.0.28 |
|
4.0.29 |
|
4.1.9.1 | 写入方式「基于标识字段,追加/更新/删除数据」修改为「基于标识字段,新增/修改/删除数据」 |
4.2.7.4 |
|
1.2 功能简介
本文介绍「数据同步」设置写入方式或者使用「数据转换-DB表输出」设置写入方式时配置项说明。
1.2.1 写入方式
「写入方式」界面如下图所示:
写入方式有三种:
注:部分数据源支持分区写入。详情请参见:读取、创建、写入分区表
写入方式 | 说明 | 效果示例 |
---|---|---|
直接将数据写入目标表 | 目标表无物理主键且未配置逻辑主键映射:直接将数据写入目标表 | 不同写入方式效果说明 |
目标表有物理主键或已配置逻辑主键映射:基于主键比对数据行的差异:主键相同、主键不同 1)主键不同的数据行:追加写入 2)主键相同的数据行,提供三种写入策略:
| ||
清空目标表,再写入数据 | 1)提供两种清表方式:
2)支持配置主键冲突策略,避免锁表情况 | |
基于标识字段,新增/修改/删除数据 | 1)目标表无物理主键:写入方式中勾选了「更新」或「删除」时,「主键映射」处不允许为空,需设置逻辑主键 2)目标表有物理主键或已配置逻辑主键映射,识别数据行的标识:新增、修改、删除:
|
1.2.2 事务控制
定时任务写入数据库时支持失败回滚,即任务执行失败后不会对目标表产生影响。
定时任务写入数据库时支持前置处理和后置处理,并支持将这些处理逻辑与核心写入操作一起封装为事务,一同支持失败回滚。
2. 写入方式说明
2.1 直接将数据写入目标表
2.1.1 主键映射
建立「来源端-目标端」的数据行对应关系,设置步骤如下图所示:
1)目标表中若存在物理主键/自动建表配置了主键,将直接根据目标表物理主键,自动生成主键映射行以确定数据唯一性。
2)目标表中若无物理主键:
目标表是自动建表生成的:自动建表时,在「字段映射」处可以手动设定单个或多个字段为物理主键,「写入方式」Tab中,「主键映射」处自动显示已设置好的物理主键。
目标表是已存在表:「主键映射」处,支持选择字段作为逻辑主键映射以确定数据唯一性;若不设置逻辑主键,直接追加写入数据。
2.1.2 主键冲突策略
注:目标端为 Hive 时,不支持「主键冲突策略」。
满足以下任一条件,需要选择「主键冲突策略」:
目标表存在物理主键。
目标表不存在物理主键,但配置了逻辑主键。
主键冲突策略有三种:
更新数据:主键相同时更新数据,新数据行覆盖旧数据行。
记为脏数据:主键相同时记为脏数据,冲突的数据行不写入。
忽略冲突:主键相同时忽略冲突,冲突的数据行不写入。
2.2 清空目标表,再写入数据
目标端为简道云时,请参见:简道云输出算子
2.2.1 4.2.7.4 之前版本
直接先把目标表清空掉,然后再写入数据;有无主键均可以选择。
4.0.29 以及之后的版本:
1)当来源表没有主键时,目标表存在主键,进行清表重写时,先清空目标表,再对目标表进行写入;
2)如果此时来源表存在两条主键相同的数据,后一条会覆盖前一条的记录;
2.2.2 4.2.7.4 及之后版本
设置项 | 说明 |
---|---|
清表方式 | 提供两种清表方式: 1)TRUNCATE:
2)DELETE:
|
主键映射 |
|
主键冲突策略 | 当来源表无主键,目标表有主键时,数据写入目标表时依然会存在主键冲突情况,所以需要设置主键冲突策略
|
2.3 基于标识字段,新增/修改/删除数据
2.3.1 功能说明
注1:目标端为 Hive 时,不支持该写入方式。
注2:新增/更新/删除可勾选任意一个或多个。
写入方式:
写入方式勾选「删除」时,可选择物理删除/逻辑删除:
逻辑删除:不实际删除数据,标记删除数据。
物理删除:实际删除数据。
两种删除方式的具体效果可参见:物理删除和逻辑删除的区别
标识字段/标识值:
1)通过标识字段和标识值筛选出需要新增/更新/删除的数据。
2)若使用「数据比对+DB表输出算子」实现数据的处理,「DB表输出」算子中的标识字段则自动读取 fdl_comparison_type 作为标识字段,且自动读取标识字段的值作为标识值。
3)表输出只选择新增/更新/删除其中一个时,「标识字段」可不填,不填则对读取的所有数据进行新增或更新或删除。
主键映射:
详情请参考本文 2.1 节说明。
1)出现条件:写入方式中勾选了「更新」或「删除」。
2)写入方式中勾选了「更新」或「删除」时,「主键映射」处不允许为空。
2.3.2 最佳实践
1)通常数据比对+DB 表输出结合使用,实现数据的增删改;详情参见:数据比对典型示例
2)单个数据同步节点使用场景:
用户希望将筛选出的数据,只做新增/更新/删除操作。
用户数据已经有了标识字段和标识值,需要对数据进行新增/更新/删除操作。
详情请参见:数据同步-基于标识字段,新增/更新/删除数据
3. 事务控制
3.1 应用场景
1)用户在定时同步向目标库写入数据时,希望可以将单次当前来源端的所有数据,放到同一个事务内装载:
要么都成功,正常提交事务,更改目标表数据。
要么都失败,事务回滚,对目标表不产生影响。
2)在定时任务同步完成后,可以将当次写入的统计数据写到自定义的表中,以方便后续校验数据。
3.2 使用限制
1)4.2.7.4 及之后版本,目标端为 Oracle、Greenplum、MySQL、SQL Server、PostgreSQL 时,支持使用「事务控制」功能。4.2.8.2 及之后版本,来源端 为 KingBaseES(SqlServer模式)、KingBaseES(MySQL模式)时,也支持使用「事务控制」功能。
2)当写入方式选择「清空目标表,再写入数据」时:
清表方式为 TRUNCATE 时,只有 PostgreSQL、Greenplum 支持使用「事务控制」功能。
清表方式为 DELETE 时,支持事务控制的数据库,均支持开启「写入事务控制」。
3.3 功能说明
定时任务写入数据库时支持前置处理和后置处理,并支持将这些处理逻辑与核心写入操作一起封装为事务,一同支持失败回滚。界面如下图所示:
事务控制配置项如下所示:
若来源端选择了并行取数 ,去向端开启「事务控制」,默认进行并行取数。
事务控制功能示例请参见:事务控制示例
功能 | 说明 |
---|---|
前置 SQL | 1)应用场景:删除目标表中XX时间段内的数据,删除后,再进行写入 2)支持使用「@temp_tbl_nm_full」引用装载时使用的中间表名,可以使用此参数定义SQL查询,其他事务中引用此表名参数时,值为空字符串 |
后置 SQL | 1)应用场景:使用「后置SQL」做装载后检查,检查最终结果是否有异常;或者来记录增量时间戳,还可以用来统计表中的总/新增数据量,以及记录 etl 完成时间 2)支持使用「@temp_tbl_nm_full」引用装载时使用的中间表名,可以使用此参数定义SQL查询,其他事务中引用此表名参数时,值为空字符串 |
主键冲突策略 | 开启「事务控制」按钮后,或者目标端为 Gbase 8A 时,主键冲突策略只能选择:
|
支持使用的参数:
参数 | 说明 |
---|---|
@temp_tbl_nm_full | 带有引号和完整SCHEMA的中间表名 |
@temp_schema_nm | 无引号的中间SCHEMA名 |
@temp_tbl_nm | 无引号的中间表名 |
@target_tbl_nm_full | 带有引号和完整SCHEMA的目标表名 |
@target_schema_nm | 无引号的目标SCHEMA名 |
@target_tbl_nm | 无引号的目标表名 |
4. 注意事项
比如来源表和目标表都有 D 列的部分数据为 NULL:
设置「写入方式」为追加写入且 A、B、C、D 都是逻辑主键,如下图所示:
运行后:若 D 列不为 NULL,若主键冲突则覆盖目标表数据;若 D 列为 NULL,若主键冲突则不会遵循覆盖逻辑,会追加写入。