flinkCDC3.0,mysql source字段类型转换,TINYINT(1)转化为boolean

        最近在尝试flinkCDC3.0的pipeline功能同步数据至doris以备实时数仓的开发,总结几点,新功能很方便,通过配置文件的方式可以采集多个表,不用单独写一个一个的flinkSQL配置,而且可以动态监控表创建、字段变更、数据变更等,非常的方便。美中不足的是目前不支持application方式提交,且检查点重启配置,任务执行日志监控等相对于比较的模糊。可能是我太菜还不会配置,话不多说,来看看我遇到的最大一个坑。

        与其说是一个坑,倒不如说是我们的业务开发和cdc3.0的问题不兼容导致。我在用flinkCDC3.0配置文件的方式,监控mysql表的binlog日志,然后动态生成doris表,然后动态刷新实时数据,其中mysql有个表的有一个status字段,其类型是TINYINT(1)类型,按照不成文的规范来说,这个类型的字段只用来存储0和1,但是我们的业务开发存储了(1,2,3,4)等数字,但是flinkCDC3.0字段映射是将 TINYINT(1) 类型默认转成了boolean类型,导致将所有大于一的数据全部转为了1,这就导致status的很多状态获取不到,那相应的doris表也被建成了boolean类型,status就只有0和1的枚举。导致数据查询where过滤的时候,滤掉了很多数据。

        映射关系图

解决方法:修改flinkCDC3.0的源码,将TINYINT(1)类型转换修改过来

1、拉取git代码:GitHub - apache/flink-cdc: Flink CDC is a streaming data integration tool

2、找到flink-cdc-connect模块下的子模块flink-cdc-pipeline-connector-mysql,在Utils包下找到

MySqlTypeUtils类,将136行case TINYINT:这个case修改一下
  return column.length() == 1 ? DataTypes.BOOLEAN() : DataTypes.TINYINT(); 
//替换为下面这行
  return DataTypes.TINYINT();

3、maven重新打包编译flink-cdc-connect模块l

4、在flink-cdc-connect的taget目录下找到jar包:

5、上传到服务器的cdc3.0安装目录的lib下,将原有pipeline-mysql  jar包删除或者备份,然后把这个改名  由此解决

 mv flink-cdc-pipeline-connector-mysql-SNAPSHOT-3.0.0.jar flink-cdc-pipeline-connector-mysql-3.0.0.jar

### MySQL字段类型Flink SQL字段类型的映射关系 在处理数据流时,MySQLFlink字段类型之间的映射是一个重要的环节。以下是常见的 MySQL 字段类型及其对应的 Flink SQL 字段类型: #### 数字类型 - **TINYINT**: 映射到 `TINYINT` 或 `SMALLINT`[^1]。 - **SMALLINT**: 映射到 `SMALLINT`。 - **MEDIUMINT, INT (INTEGER)**: 映射到 `INT`。 - **BIGINT**: 映射到 `BIGINT`。 - **FLOAT**: 映射到 `FLOAT`。 - **DOUBLE, REAL**: 映射到 `DOUBLE`。 #### 字符串类型 - **CHAR(n), VARCHAR(n), TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT**: 映射到 `STRING`。 #### 时间日期类型 - **DATE**: 映射到 `DATE`。 - **TIME**: 映射到 `TIME(0)` 到 `TIME(precision)`,其中 precision 是秒的小数位数。 - **DATETIME, TIMESTAMP**: 映射到 `TIMESTAMP(precision)`。 #### 布尔类型 - **BOOLEAN, BOOL**: 映射到 `BOOLEAN`。 #### 二进制类型 - **BINARY, VARBINARY, TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB**: 映射到 `BYTES`。 #### JSON 类型 - **JSON**: 映射到 `ROW<...>` 结构化表示或 `MAP<STRING, STRING>` 表示。 #### 特殊范围类型(仅限 Elasticsearch) 对于某些特殊场景下的字段类型,例如 ElasticSearch 中的范围类型,其映射如下: - **integer_range, long_range**: 可以通过自定义逻辑转换为 `ARRAY<INT>`, `ARRAY<BIGINT>` 等集合形式[^2]。 - **float_range, double_range**: 同样可以通过类似的数组方式存储为 `ARRAY<FLOAT>`, `ARRAY<DOUBLE>`。 #### 复杂类型的支持 当涉及到复杂的数据结构时,如组合类型中的元组、POJOs 或者 Scala Case Classes,在 Table API 下可以直接被解析并映射至相应的列名和字段类型。默认情况下,元组字段会被命名为 `_1`, `_2` 等顺序编号;而对于原子类型则统一采用前缀命名法如 `f0`, `f1` 来区分不同属性的位置索引。 ```python from pyflink.table import DataTypes from pyflink.table.descriptors import Schema, OldCsv, FileSystem t_env.connect(FileSystem().path(&#39;/path/to/file&#39;)) \ .with_format(OldCsv() .field(&#39;id&#39;, DataTypes.BIGINT()) .field(&#39;name&#39;, DataTypes.STRING())) \ .with_schema(Schema() .field(&#39;id&#39;, DataTypes.BIGINT()) .field(&#39;name&#39;, DataTypes.STRING())) \ .register_table_source("MySource") ``` 上述代码展示了如何配置表源以及指定每列的具体数据类型。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值