同步对象映射
目标对象用 a.b.c
方式表达,比如 a 为Database,b 为 Schema,c 为 Table。
对象映射用于描述源端节点下的所有叶子对象(比如 Table )同步到目标端哪个叶子对象(比如 Table )。不同的作业类型,有不同的默认映射规则,通过修改节点上的映射规则去覆盖默认映射规则。
修改节点映射
映射可以在各个节点修改,和节点属性修改类似,有继承和覆盖方式。
映射规则可以通过“批量修改”按钮批量应用到兄弟节点
节点映射语法
目前支持三种表达方式:
1. 常量
必须用单引号括起来,单引号内部为目标对象的表达方式,比如:'a.b.c'
2. concat 函数
函数中支持常量和源端变量,常量描述如上。源端变量不用引号或者用双引号括起来,比如 SOURCE_DATABASE
表示为源端数据库名,SOURCE_SCHEMA
表示为源端 schema 名,SOURCE_OBJECT
表示为源端对象名(表、视图、函数等)。比如下图的 concat(SOURCE_DATABASE, '.', 'public', '.', SOURCE_OBJECT)
,表示为将源端数据库下的表同步到目标同名数据库的 public 下的表。
3. 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 示例
全局修改目标端 ProtonBase 的默认 Database、Schema 名称
如下图在 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 为默认字段名称和类型,可以输入修改
默认映射
不同的作业类型,有不同的默认映射规则,参考各个作业类型的介绍。