flink table api目前支持的数据格式(https://ci.apache.org/projects/flink/flink-docs-release-1.7/dev/table/tableApi.html )除基础数据格式外还支持pojo,但毕竟支持有限,我们希望通过固定的解析,就能直接从kafka直接消费数据,并封装成register table,以供sql查询。本文主要说明如何实现flink对binlog的支持。
1、flink的数据解析入口
以下是flink table api接入消费kafka json格式数据的代码片段,可以看到withFormat函数传入的是一个new Json()对象,我们查看一下下flink-Json的源码
StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironment();
StreamTableEnvironment tableEnv = TableEnvironment.getTableEnvironment(env);
tableEnv.connect(
new Kafka()
.version("0.10")
.topic("binlog.movieorderera01_movie_u_order_sharding")
.startFromEarliest()
.property("zookeeper.connect", "localhost:2181")
.property("bootstrap.servers", "localhost:9092"))
.withFormat(new Json().deriveSchema())
.withSchema(
new Schema()
.field("COD_USERNO","string")
.field("COD_USER_ID","string"))
.inAppendMode()
.registerTableSource("sm_user");
tableEnv.sqlQuery("select * from sm_user").printSchema();
源码目录如下,可以看出,flink-json的目录下有两个包,首先看descriptors,下面有两个类,其中Json这个类就是上面代码中调用的,所以我们需要些两个类BinLogParse和BinlogValidator,不需要做很多操作,复制改名并修改里面的成员变量名称就可以。代码如下
BinLogParse.java
public class BinLogParse extends FormatDescriptor {
private Boolean failOnMissingField;
private Boolean deriveSchema;
private String bin