You need to enable JavaScript to run this app.
导航
解决方案数据转换配置指南
最近更新时间:2025.09.25 19:15:01首次发布时间:2024.11.18 19:55:14
复制全文
我的收藏
有用
有用
无用
无用

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

  • 字段拆分、合并、重排序:可以灵活使用 SELECT 语句,对源表的字段做拆分、合并、顺序调整。
  • 清洗过滤:可以使用 WHERE 条件语句,过滤冗余数据、处理缺失值、纠正数据错误等。
  • 预处理:可以使用条件函数,对数据(例如 null 值)进行标准化等预处理。
  • 格式转换:可以使用转换函数、加解密函数,将数据从一种格式转换为另一种格式。

1 注意事项

  • 转换规则功能属于 BETA 公测阶段,在函数支持度、边界条件处理等细节方面仍在飞速演进。欢迎试用并提出建议。
  • 目前兼容 Flink 1.11 的常用函数(详见数据转换函数库)及其输入输出行为,并持续引入高版本 Flink 函数、拓展函数(例如 JSON 函数、AES 加解密函数)来进一步拓展处理能力。
  • 输入的转换 SQL 语句仅支持 Flink 内部的 Flink SQL 语句,不支持源端或目标端数据源类型的 SQL 语法。

2 操作步骤

您可以通过以下方式进入数据转换配置:

2.1 进入数据转换配置

目前离线整库同步、实时整库同步、实时分库分表同步三种解决方案支持数据转换规则的配置。

  1. 登录 DataSail 控制台
  2. 在左侧导航栏中选择数据同步方案,进入同步方案配置界面。
  3. 单击目录树中项目选择入口,选择已创建的 DataLeap 项目。
    Image
  4. 单击右上角新建数据同步解决方案按钮,下拉选择对应的同步方案按钮,进入方案配置界面。
  5. 依次完成方案的基本配置,单击下一步,进入映射配置界面。
  6. 在映射配置界面,完成数据源库表选择后,便可开始数据转换配置。

Image
基本配置操作详见各解决方案操作详情

2.2 配置转换规则

2.2.1 整库同步

对于整库同步(包含离线整库同步、实时整库同步)解决方案,您可在映射配置 > 数据转换配置栏目中,单击配置详情,在语句输入框中,输入对已选特定表的 SQL 转换语句(每个新字段都需要使用 AS 子句命名,后续会与下游表做同名字段映射),其中 FROM 后的源表名支持正则形式,且库表分隔符(.)无需转义,示例如下:

注意

输入的转换 SQL 语句仅支持 Flink 内部的 Flink SQL 语句,不支持源端或目标端数据源类型的 SQL 语法。

Image
语句输入框右侧,您可进行以下操作:

  1. 删除:当添加多条 SQL 转换语句后,您可将除首条语句之外的转换语句进行删除操作,首条转换语句可通过上移、下移按钮进行调整。
  2. 添加:可添加多条 SQL 转换语句。
  3. 上移:将当前行所在 SQL 转换语句位置,向上进行调整。
  4. 下移:将当前行所在 SQL 转换语句位置,向下进行调整。

SQL 规则与数据库表的关系如下:
Image

注意

  1. 对于SELECT子句中的输出结果,我们采用同名映射逻辑写入下游,即每个新字段都需要使用 AS 来命名,以匹配下游表的同名字段。​例如 SELECT id, CONCAT('Mr. ', customer_name) AS display_name) SQL 产生的数据可以写入下游表的 id 和 display_name 字段。但如果忘记加 AS,则无法匹配下游表的 display_name 字段,最终只有 id 字段会写入下游。
  2. 支持 SELECT * 语法选择表中所有字段,例如可以通过 SELECT *, 'Hello' AS new_field 为每个选中的表统一添加一个名为 new_field 的新字段,每个表的 Schema(字段名和类型)可以不同。
  3. 应用 SQL 转换后,如果源表的主键名发生变更(例如 id 变成 new_id),则需要在数据转换配置 > 高级参数中,显式指定新的主键名,如:primary_keys=new_id(如上图所示),否则会报错,报错信息示例如下:
    Image
  4. 每条规则的 FROM 可以匹配已选表中的多个表(源表名支持正则,且无需对分隔符添加转义,即需要写 db_name.table_prefix.* 而非 db_name\.table_prefix.*db_name.table_prefix\.*),但每个表仅能被一条规则所匹配,否则会报错,报错信息示例如下:
    Image
  5. 对于 PostgreSQL 等含三级结构的数据源,FROM 所选的源表也请务必包含所有层次,例如 FROM db_name.schema_name.table_prefix.*
  6. 目前 SQL 语句暂不支持中文字符常量值。如果希望使用中文,请暂时通过 FROM_BASE64() 函数解码包含中文字符的 Base64 串,例如使用 WHERE name = FROM_BASE64('5ZOI5ZOI') 而非 WHERE name = '哈哈'
  7. 目前 SQL 语句中,常量的类型暂不支持隐式转换,​因此请务必确保传入函数的参数类型都符合函数定义。
    • 含小数点的数字常量值默认类型推断为 DECIMAL。如果希望将其用作 DOUBLE 类型,则需要显式 CAST。例如:如果 price 字段的类型是 DOUBLE,则 WHERE 条件需要写为 price BETWEEN CAST(123.456 AS DOUBLE) AND CAST(567.123 AS DOUBLE)
    • 不含小数点的数字常量值默认类型推断为 INTEGER。如果希望将其用作 BIGINT 等其他类型,则需要显式 CAST。例如:如果 id 字段的类型是 BIGINT,则 WHERE 条件需要写为id IN (CAST(1 AS BIGINT), CAST(2 AS BIGINT), CAST(3 AS BIGINT))
  8. 单行只允许输入一个 SQL 语句,多个 SQL 语句之间通过行分隔,SQL 语句之间是并行逻辑。

转换语句配置完成后,可以在下方目标库表映射配置 栏目,配置完库/表名映射配置后,单击刷新源表和目标表映射按钮。如果语法正确,则会展示出变换后的新表的结构信息。

2.2.2 分库分表

分库分表模式下,转换规则的配置方法与整库同步方案类似,主要区别如下:

注意

分库分表注意事项

  1. 分库分表的源表只支持全匹配,不支持圈选特定的上游表,否则会报错(如下图)。例如对于 MySQL 等二级结构数据源的,需写FROM .*..* 或者对于 PostgreSQL 等三级结构数据源的,需写FROM .*..*..*
    Image
  2. 分库分表的 SELECT 字段建议包含 _src_meta_info_ 字段(即使 SELECT * 时也建议显式加入该字段,例如 SELECT *, _src_meta_info_)。该字段用于标识该条数据是从哪个实际上游表输入的,也可避免多个分表的数据出现重复 id 导致的写入出错等问题。
  3. 分库分表暂时不支持 DDL 变更策略设置,例如不支持运行时新增列、删除列、修改列类型等操作。

3 元数据字段说明

我们在 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 是非法的。
  • 对于 ByteHouse 等目标数据源,表的字段名不允许以 "__" 开头,因此元数据字段的引用,必须使用 AS 来给元数据字段赋予新的名字,例如 __table_name__ AS table_name,不允许直接将原始字段名映射到下游表。

3.1 数据源相关的元数据字段映射关系

说明

下表中映射关系说明:

  • 三级结构(Database、Schema、Table),例如:PostgreSQL、SQL Server
  • 普通二级结构(Database、Table),例如:MySQL、MongoDB、StarRocks、Doris

结构分类

__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 * 时,会自动包含该字段,无需手动添加),否则将会出现以下报错内容:
Image

3.2 数据相关的元数据字段

  • __op_type__
    返回这条数据的类型(字符串形式),取值范围是 INSERT、UPDATE_BEFORE、UPDATE_AFTER、DELETE。
  • __ts_ms__
    • 对于 CDC 作业:返回数据写入 Binlog 的业务时间戳,如果无法获取则返回 -1。
    • 对于批作业:默认返回 0,​可以通过 job.transform.ts_ms_field_value_for_batch 高级参数修改批作业的该字段默认值。
      • 此外,如果设置 job.transform.ts_ms_field_policy_for_batch 高级参数的值为 EPOCH_TIME,则该字段返回每条数据的实际读取时刻(动态变化)。
  • _src_meta_info_
    分库分表模式下,用于表示这条数据的来源库表信息,以及防止同 Key 数据写入发生冲突。