Flink CDC Connectors 数据转换功能深度解析
什么是数据转换功能
Flink CDC Connectors 提供的 Transform(数据转换)模块是一个强大的数据处理工具,它允许用户在数据同步过程中对数据进行灵活的处理和转换。这个功能特别适合需要在数据从源端流向目标端时进行实时处理的场景。
核心功能概述
Transform 模块主要提供三大核心能力:
- 列操作:可以删除、保留或扩展数据列
- 数据过滤:能够过滤掉不需要同步的数据行
- 元数据处理:可以访问和使用表的元数据信息
详细参数解析
Transform 规则通过一组精心设计的参数进行配置:
| 参数名称 | 说明 | 是否必填 | |---------|------|---------| | source-table | 源表标识,支持正则表达式 | 必填 | | projection | 列投影规则,类似SQL的SELECT子句 | 可选 | | filter | 过滤规则,类似SQL的WHERE子句 | 可选 | | primary-keys | 目标表的主键定义 | 可选 | | partition-keys | 目标表的分区键定义 | 可选 | | table-options | 自动建表时的表选项配置 | 可选 | | description | 规则描述信息 | 可选 |
元数据字段详解
Transform 模块提供了一些特殊的隐藏字段,用于访问表的元数据信息:
__namespace_name__
:命名空间名称(字符串类型)__schema_name__
:模式名称(字符串类型)__table_name__
:表名称(字符串类型)
这些字段在不同数据库系统中的具体含义有所差异:
| 数据库类型 | Namespace对应 | SchemaName对应 | Table对应 | |-----------|--------------|---------------|----------| | MySQL | 数据库 | - | 表 | | PostgreSQL | 数据库 | 模式 | 表 | | Oracle | - | 模式 | 表 | | SQL Server | 数据库 | 模式 | 表 |
丰富的函数支持
Transform 模块基于Calcite解析表达式,使用Janino脚本评估表达式,提供了多种类型的函数:
1. 比较函数
包括等于(=)、不等于(<>)、大于(>)、小于(<)等常见比较操作,以及BETWEEN、IN、LIKE等特殊比较操作。
2. 逻辑函数
支持AND、OR、NOT等逻辑运算,以及IS TRUE、IS FALSE等逻辑判断。
3. 算术函数
提供加减乘除等基本运算,以及ABS、CEIL、FLOOR等数学函数,还包括生成UUID的实用函数。
4. 字符串函数
包含字符串连接(||)、大小写转换(UPPER/LOWER)、子串提取(SUBSTRING)等常见字符串操作。
5. 时间函数
提供获取当前时间(CURRENT_TIMESTAMP)、日期格式化(DATE_FORMAT)、时间差计算(TIMESTAMPDIFF)等功能。
6. 条件函数
支持CASE WHEN、COALESCE、IF等条件判断和值选择函数。
典型应用场景示例
1. 添加计算列
transform:
- source-table: mydb.web_order
projection: id, order_id, UPPER(product_name) as product_name, localtimestamp as new_timestamp
这个示例将产品名称转为大写,并添加当前时间戳作为新列。
2. 引用元数据列
transform:
- source-table: mydb.web_order
projection: id, order_id, __namespace_name__ || '.' || __schema_name__ || '.' || __table_name__ as identifier_name
这个示例将数据库、模式和表名拼接成一个完整的标识符。
3. 使用通配符选择所有列
transform:
- source-table: mydb.web_order
projection: \*, UPPER(product_name) as product_name
注意:当*
出现在表达式开头时,需要使用反斜杠转义。
4. 数据过滤
transform:
- source-table: mydb.web_order
filter: id > 10 AND order_id > 100
这个示例只同步ID大于10且订单ID大于100的记录。
5. 重新定义主键
transform:
- source-table: mydb.web_order
projection: id, order_id
primary-keys: order_id
这个示例将order_id设为主键,支持复合主键定义。
6. 分类映射
transform:
- source-table: mydb.web_order
projection: id, order_id
filter: UPPER(province) = 'SHANGHAI'
- source-table: mydb.web_order
projection: order_id as id, id as order_id
filter: UPPER(province) = 'BEIJING'
这个示例对不同地区的订单采用不同的处理方式。
使用建议与注意事项
- 目前Transform功能还不能与路由规则同时使用
- 计算列不能引用最终投影结果中不存在的列
- 不同模式的表不能使用正则表达式匹配,需要为每个模式单独编写规则
- 对于复杂的数据转换需求,建议先在测试环境验证转换规则
通过合理使用Transform功能,可以大大简化数据同步过程中的ETL处理流程,实现更灵活的数据集成方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考