设置映射规则
映射规则的重要性
在数据同步过程中,源端和目标端的数据库结构可能不完全一致。例如,我们可能需要将多个源表合并到一个目标表中,或者需要将源表映射到不同的目标数据库或模式中。通过设置映射规则,我们可以灵活地控制数据同步的目标位置,实现更复杂的数据迁移需求,满足不同的业务场景。
目标对象用 a.b.c
方式表达,其中 a 为数据库(Database),b 为模式(Schema),c 为表(Table)。
对象映射用于描述源端节点下的所有叶子对象(比如表)同步到目标端哪个叶子对象(比如表)。不同的同步任务类型,有不同的默认映射规则,通过修改节点上的映射规则去覆盖默认映射规则。
节点映射修改
映射可以在各个节点修改,和节点属性修改类似,有继承和覆盖方式。
映射规则可以通过"批量修改"按钮批量应用到兄弟节点
映射语法规则
目前支持三种表达方式:
常量表达式
必须用单引号括起来,单引号内部为目标对象的表达方式,比如:'a.b.c'
Concat 函数
函数中支持常量和源端变量,常量描述如上。源端变量不用引号或者用双引号括起来,比如 SOURCE_DATABASE
表示为源端数据库名,SOURCE_SCHEMA
表示为源端 schema 名,SOURCE_OBJECT
表示为源端对象名(表、视图、函数等)。比如下图的 concat(SOURCE_DATABASE, '.', 'public', '.', SOURCE_OBJECT)
,表示为将源端数据库下的表同步到目标同名数据库的 public 下的表。
Case When 条件表达式
对于复杂映射,比如分库分表合并到一个目标表,可以用 case when
表达,语法如下
case
when ${condition} then ${expression}
...
when ${condition} then ${expression}
else ${expression}
end
其中 expression 为上述的常量、变量或者 concat
函数;condition 目前支持两种方式:like
和 regexp_match
。
case
when ${expression} like ${expression} then ${expression}
when regexp_match(${expression}, ${regex}) like then ${expression}
...
when ${condition} then ${expression}
else ${expression}
end
其中 regex 为标准正则表达方式,支持将 () 内的数据作为分组提取出来,提取的变量名为 $1, $2,......, $n,可以用于 expression 表达式 例子:将源端 t1_000,t1_001,......,t1_009 映射到目标端 t1,将源端 t2_000,t2_001,......,t2_009 映射到目标端 t2 通过 like 配置分表映射
case
when SOURCE_OBJECT like 't1_%' then concat(SOURCE_DATABASE, '.public.t1')
when SOURCE_OBJECT like 't2_%' then concat(SOURCE_DATABASE, '.public.t2')
else concat(SOURCE_DATABASE, '.', 'public', '.', SOURCE_OBJECT)
end
通过 regexp_match
配置分表映射
case
when regexp_match(SOURCE_OBJECT, '(.*)_[0-9]{3}$') then concat(SOURCE_DATABASE, '.public.', $1)
else concat(SOURCE_DATABASE, '.', 'public', '.', SOURCE_OBJECT)
end
MySQL 到 ProtonBase 映射示例
全局映射配置
如下图在 mysql_normal_test 数据库上用下面的映射规则(可以替换 another_dababase、another_scheam 成需要的目标名称)
concat('another_dababase', '.', 'another_scheam', '.', SOURCE_OBJECT)
单表映射配置
如下图在 json_type_test 表上用下面的映射规则(可以替换 another_table 成需要的目标名称)
concat(SOURCE_DATABASE, '.', 'public', '.', 'another_table')
分库分表映射配置
如下图在 test 数据库上用下面的映射规则,用 case when 中的 like 去匹配分库分表
case
when SOURCE_OBJECT like 't1_%' then concat(SOURCE_DATABASE, '.', 'public', '.', 't1')
when SOURCE_OBJECT like 't2_%' then concat(SOURCE_DATABASE, '.', 'public', '.', 't2')
else concat(SOURCE_DATABASE, '.', 'public', '.', SOURCE_OBJECT)
end
也可以用 regexp_match
正则去匹配:
case
when regexp_match(SOURCE_OBJECT, '(.*)_[0-9]{3}') then concat(SOURCE_DATABASE, '.', 'public', '.', $1)
else concat(SOURCE_DATABASE, '.', 'public', '.', SOURCE_OBJECT)
end
字段映射配置
Column Mapping 可以做字段的裁剪、映射和转换。
目标端已经存在的表,只能做字段裁剪和映射:
- Action 中做字段裁剪
- Target 中选择目标表字段
目标不存在的表,可以做字段的裁剪、转换
- Action 中做字段裁剪
- Target 为默认字段名称和类型,可以输入修改
默认映射规则
不同的同步任务类型,有不同的默认映射规则,参考各个任务类型的介绍。