我是 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
在数据集成时,肯定会存在数据表字段与内部字段冲突的情况,因为在数据库表层面来看,能建立这样的字段,就是合理的。而因为数据表字段与内部字段冲突引发报错的问题,建议官方进行文档的完善及给出相应问题修复方案。
到此这篇sqlldr(Sqlldr多字节字符错误)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/sqlbc/30081.html