DataSail 实时/离线整库同步、实时分库分表同步解决方案,支持添加自定义 SQL 转换规则。它支持将源端采集的数据,对其进行各种数据转换操作,以满足各类业务场景需求。
数据转换可以应用于各种轻量级数据处理场景,例如:
您可以通过以下方式进入数据转换配置:
目前离线整库同步、实时整库同步、实时分库分表同步三种解决方案支持数据转换规则的配置。

基本配置操作详见各解决方案操作详情。
对于整库同步(包含离线整库同步、实时整库同步)解决方案,您可在映射配置 > 数据转换配置栏目中,单击配置详情,在语句输入框中,输入对已选特定表的 SQL 转换语句(每个新字段都需要使用 AS 子句命名,后续会与下游表做同名字段映射),其中 FROM 后的源表名支持正则形式,且库表分隔符(.)无需转义,示例如下:
注意
输入的转换 SQL 语句仅支持 Flink 内部的 Flink SQL 语句,不支持源端或目标端数据源类型的 SQL 语法。
语句输入框右侧,您可进行以下操作:
SQL 规则与数据库表的关系如下:
注意
SELECT子句中的输出结果,我们采用同名映射逻辑写入下游,即每个新字段都需要使用 AS 来命名,以匹配下游表的同名字段。例如 SELECT id, CONCAT('Mr. ', customer_name) AS display_name) SQL 产生的数据可以写入下游表的 id 和 display_name 字段。但如果忘记加 AS,则无法匹配下游表的 display_name 字段,最终只有 id 字段会写入下游。SELECT * 语法选择表中所有字段,例如可以通过 SELECT *, 'Hello' AS new_field 为每个选中的表统一添加一个名为 new_field 的新字段,每个表的 Schema(字段名和类型)可以不同。db_name.table_prefix.* 而非 db_name\.table_prefix.* 或 db_name.table_prefix\.*),但每个表仅能被一条规则所匹配,否则会报错,报错信息示例如下:FROM db_name.schema_name.table_prefix.*。WHERE name = FROM_BASE64('5ZOI5ZOI') 而非 WHERE name = '哈哈'。price 字段的类型是 DOUBLE,则 WHERE 条件需要写为 price BETWEEN CAST(123.456 AS DOUBLE) AND CAST(567.123 AS DOUBLE)id 字段的类型是 BIGINT,则 WHERE 条件需要写为id IN (CAST(1 AS BIGINT), CAST(2 AS BIGINT), CAST(3 AS BIGINT))转换语句配置完成后,可以在下方目标库表映射配置 栏目,配置完库/表名映射配置后,单击刷新源表和目标表映射按钮。如果语法正确,则会展示出变换后的新表的结构信息。
分库分表模式下,转换规则的配置方法与整库同步方案类似,主要区别如下:
注意
分库分表注意事项
FROM .*..* 或者对于 PostgreSQL 等三级结构数据源的,需写FROM .*..*..*_src_meta_info_ 字段(即使 SELECT * 时也建议显式加入该字段,例如 SELECT *, _src_meta_info_)。该字段用于标识该条数据是从哪个实际上游表输入的,也可避免多个分表的数据出现重复 id 导致的写入出错等问题。我们在 SELECT 语句中,可以引用一些数据字段,例如:
SELECT __database_name__ AS dbName, __schema_name__ AS schemaName, __table_name__ AS tableName, __op_type__ AS opType, __ts_ms__ AS transMs FROM my_database..*
注意
CONCAT(__table_name__ , '-SUFFIX') 、__ts_ms__ + 100 是非法的。AS 来给元数据字段赋予新的名字,例如 __table_name__ AS table_name,不允许直接将原始字段名映射到下游表。说明
下表中映射关系说明:
结构分类 | __database_name__ | __schema_name__ | __table_name__ | |
|---|---|---|---|---|
三级结构 | PostgreSQL | Database | Schema | Table |
GaussDB | Database | Schema | Table | |
SQL Server | Database | Schema | Table | |
普通二级结构 | MySQL | Database | -(输出 null,下同) | Table |
MongoDB | Database | - | Table | |
veDB | Database | - | Table | |
StarRocks | Database | - | Table | |
Doris | Database | - | Table | |
注意
分库分表模式下,若转换语句中需要使用上述元数据字段,那么 SELECT 语句中必须包含 _src_meta_info_ 字段(特殊例外情况:使用 SELECT * 时,会自动包含该字段,无需手动添加),否则将会出现以下报错内容:
__op_type__:__ts_ms__:
job.transform.ts_ms_field_value_for_batch 高级参数修改批作业的该字段默认值。
job.transform.ts_ms_field_policy_for_batch 高级参数的值为 EPOCH_TIME,则该字段返回每条数据的实际读取时刻(动态变化)。_src_meta_info_: