Flink SQL的Sink表只支持全字段数据插入,不支持指定字段数据插入和更新操作,那后面结果表增加字段如何处理?
首先我们需要给Sink指定主键,如果输出存储是声明了主键(primary key)的数据库(例如,RDS/ES/HBASE等),数据流的输出结果有以下2种情况:
- 如果根据主键查询的数据在数据库中不存在,则会将该数据插入数据库。
- 如果根据主键查询的数据在数据库中存在,则会根据主键更新数据。
这里跟mysql数据库的for update效果一样,所以我们可以使用这个特性进行分批次插入。解决了两个问题:
- 结果表有几百个甚至上千个字段的话,可以拆分成多个sql进行插入和更新数据。
- 结果表随着业务发展需要增加字段的话,可以根据此特性更新新字段的存量数据。
大SQL拆分
这里简单举个例子,我们的源数据表如下:
CREATE TABLE `user_source` (
`user_id` string,
`user_name` STRING,
`mobile` STRING,
`create_time` timestamp,
`update_time` timestamp
) with (
'connector' = 'mysql-cdc',
'debezium.snapshot.locking.mode' = 'none',
'hostname' = 'localhost&