You need to enable JavaScript to run this app.
导航
解决方案数据转换配置指南
最近更新时间:2024.11.18 19:55:14首次发布时间:2024.11.18 19:55:14

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

说明

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

数据转换可以应用于各种轻量级数据处理场景,例如:

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

1 操作步骤

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

1.1 进入数据转换配置

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

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

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

1.2 配置转换规则

1.2.1 整库同步

对于整库同步(包含离线整库同步、实时整库同步)解决方案,您可在映射配置 > 数据转换配置栏目中,单击配置详情,在语句输入框中,输入对已选表的 SQL 转换语句,其中 FROM 后的源表名支持正则形式,且库表分隔符(.)无需转义,示例如下:
Image
语句输入框右侧,您可进行以下操作:

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

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

注意

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

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

1.2.2 分库分表

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

注意

分库分表注意事项

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

2 元数据字段说明

我们在 SELECT 语句中,可以引用一些数据字段,例如:

SELECT __namespace_name__, __schema_name__, __table_name__, __op_type__, __ts_ms__ FROM my_database..*

注意

  • 不允许对元数据字段应用任何函数和变换,例如 CONCAT(__table_name__ , '-SUFFIX')__ts_ms__ + 100 是非法的。
  • 对于 ByteHouse 等目的数据源,表的字段名不允许以 __ 开头,因此必须使用 AS 来给元数据字段赋予新的名字,例如 __table_name__ AS table_name

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

说明

下表中映射关系说明:

  • 三级结构(Namespace、Schema、Table),例如:JDBC、Debezium、PostgreSQL、SQL Server
  • 特殊二级结构(Schema、Table),例如:Oracle
  • 普通二级结构(Namespace、Table),例如:MySQL、MongoDB、StarRocks、Doris

结构分类

namespace_name

schema_name

__table_name

三级结构

JDBC

Catalog

Schema

Table

Debezium

Catalog

Schema

Table

PostgreSQL

Database

Schema

Table

SQL Server

Database

Schema

Table

特殊二级结构

Oracle

-

Schema

Table

普通二级结构

MySQL

Database

-

Table

StarRocks

Database

-

Table

Doris

Database

-

Table

注意

分库分表模式下,全量阶段的库表元数据字段统一返回 "*",请从 src_meta_info 字段读取源表信息。

2.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 数据写入发生冲突。