我是 Porterxie,一个爱问为什么的程序员。最近在使用 flink-jdbc-connector 读取 SqlServer 表数据时,因为读取字段与关键字冲突导致读取报错。本文将对该问题进行详细的分析。
1、启动 sql-client,运行如下语句
讯享网
2、在 sql-client 中,执行如下查询语句
讯享网
3、查看报错信息
4、此时不论将 ·select· 修改成 "select" 或者 [select],在 flink sql 的层面上都是无法解析的

5、在翻阅了 flink 官方文档未果后,我把问题解决方式转移到 flink-jdbc-connector 的源码上(此处我用的 flink-jdbc-connector 3.2 的源码)。同时我们不难梳理出这样一个 flink sql 的处理流程:flink sql 在接收输入的 sql 之后,先进行 flink sql 解析及校验,然后在具体 sink 类中进行最终执行 sql 的构建,调用驱动执行数据查询。
6、因为 flink connector 都是通过 SPI 的方式实现的插件注册,因此代码结构非常清晰明了。因为是读取发生问题,所以我们需要关注的是 DynamicTableSource 的创建,如下所示

7、我们来到 DynamicTableSource getScanRuntimeProvider 看一下通过驱动读取数据库的语句的生成过程,如下所示


8、代码跟进去,来到 AbstractDialect 类

我们可以看到 field 使用了 quoteIdentifier 方法进行包装,因此我们看一下这个方法在 SqlServer 中的实现

可以看到是原样返回,此处我们可以做如下修改进行测试(测试代码仅供参考)

9、重新打包 flink connector jdbc,替换掉 flink lib 中的 flink connector jdbc 包,重启 cluster,执行 sql

在数据集成时,肯定会存在数据表字段与内部字段冲突的情况,因为在数据库表层面来看,能建立这样的字段,就是合理的。而因为数据表字段与内部字段冲突引发报错的问题,建议官方进行文档的完善及给出相应问题修复方案。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/138546.html