Apache Flink CDC 数据转换功能详解
概述
Apache Flink CDC 的数据转换(Transform)模块是一个强大的数据处理工具,它允许用户在数据同步过程中对数据进行灵活的处理和转换。该模块主要提供三大核心功能:
- 列操作:支持列的删除、重命名和扩展
- 数据过滤:可以在同步过程中过滤掉不需要的数据
- 元数据处理:支持访问和操作表的元数据信息
核心概念解析
转换规则参数
转换规则由一组参数定义,这些参数决定了如何处理输入数据:
| 参数名称 | 作用描述 | 是否必填 | |----------------|-------------------------------------------------------------------------|---------| | source-table | 指定源表标识,支持正则表达式匹配 | 必填 | | projection | 定义列投影规则,语法类似SQL的SELECT子句 | 可选 | | filter | 定义过滤条件,语法类似SQL的WHERE子句 | 可选 | | primary-keys | 指定目标表的主键,多个主键用逗号分隔 | 可选 | | partition-keys | 指定目标表的分区键,多个分区键用逗号分隔 | 可选 | | table-options | 用于配置自动创建表时的表选项 | 可选 | | description | 转换规则的描述信息 | 可选 |
元数据字段
Flink CDC 提供了一些隐藏的元数据字段,可以在转换规则中显式引用:
__namespace_name__
: 包含行的命名空间名称__schema_name__
: 包含行的模式名称__table_name__
: 包含行的表名称
不同数据源的元数据对应关系如下:
| 数据源类型 | Namespace对应 | SchemaName对应 | Table对应 | |----------------|--------------|---------------|----------| | JDBC | Catalog | Schema | Table | | MySQL | Database | - | Table | | PostgreSQL | Database | Schema | Table | | Oracle | - | Schema | Table | | SQL Server | Database | Schema | Table |
功能详解
1. 计算列添加
可以在投影规则中使用表达式生成新的计算列:
transform:
- source-table: mydb.web_order
projection: id, order_id, UPPER(product_name) as product_name, localtimestamp as new_timestamp
这个例子中,我们将product_name
转换为大写,并添加了一个当前时间戳列。
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. 数据过滤
可以使用类似SQL WHERE子句的语法过滤数据:
transform:
- source-table: mydb.web_order
filter: id > 10 AND order_id > 100
也可以在过滤条件中使用计算列:
transform:
- source-table: mydb.web_order
projection: id, order_id, UPPER(province) as new_province
filter: new_province = 'SHANGHAI'
5. 主键重定义
可以重新定义目标表的主键:
transform:
- source-table: mydb.web_order
primary-keys: order_id
也支持复合主键:
transform:
- source-table: mydb.web_order
primary-keys: order_id, product_name
6. 分区键指定
可以指定目标表的分区键:
transform:
- source-table: mydb.web_order
partition-keys: product_name
7. 表创建选项
可以在自动创建表时指定表选项:
transform:
- source-table: mydb.web_order
table-options: comment='web order', compression='lz4'
8. 分类映射
可以定义多个转换规则实现数据分类处理:
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'
函数支持
Flink CDC 转换模块支持丰富的函数,包括:
- 比较函数:=, <>, >, >=, <, <=, IS NULL, IS NOT NULL, BETWEEN, LIKE, IN等
- 逻辑函数:AND, OR, NOT, IS TRUE, IS FALSE等
- 算术函数:+, -, *, /, %, ABS, CEIL, FLOOR, ROUND, UUID等
- 字符串函数:CONCAT, CHAR_LENGTH, UPPER, LOWER, TRIM, REGEXP_REPLACE, SUBSTRING等
- 时间函数:LOCALTIME, LOCALTIMESTAMP, CURRENT_DATE, DATE_FORMAT, TIMESTAMPDIFF等
- 条件函数:CASE WHEN, COALESCE, IF等
实际应用场景
- 数据清洗:过滤无效数据,标准化数据格式
- 数据脱敏:对敏感信息进行转换或屏蔽
- 数据聚合:基于条件对数据进行分类处理
- 数据结构调整:重命名列、调整列顺序、添加计算列
- 多源整合:统一不同数据源的结构差异
注意事项
- 当前版本中,转换功能还不能与路由规则同时使用
- 计算列不能引用在最终投影结果中被裁剪的列
- 不支持跨不同模式的表进行正则匹配,需要为每个模式单独编写规则
通过灵活运用Flink CDC的转换功能,可以大大简化数据集成和ETL流程,实现更高效的数据处理。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考