flink sql 读取已存在的表报错


6.1的tidb
1.15.2的flink
tidb里的数据就是上一次flinksql写进去的,今天去查询就有问题。
下方是flink侧的建表语句
CREATE TABLE MyUserTable (
id STRING,
name STRING,
age STRING,
status STRING,
PRIMARY KEY (id) NOT ENFORCED
) WITH (
‘connector’ = ‘jdbc’,
‘url’ = ‘jdbc:mysql://10.19.36.83:4000/fromflink152’,
‘table-name’ = ‘users’,
‘username’ = ‘root’,
‘password’ = ‘NU75_KVk6#R813c@!p’
);

这个报错看起来是语法错误,可以看看 tidb log 对应日志是什么,里面应该有具体 SQL 信息

代码贴出来瞅瞅呀,提示语法错误

貌似可以

1 个赞

orz (⊙_⊙)?

给你个例子:

cat tidb.log

[2022/10/10 14:09:29.732 +08:00] [INFO] [conn.go:1165] ["command dispatched failed"] [conn=6079643992671126491] [connInfo="id:6079643992671126491, addr:127.0.0.1:12790 status:10, collation:utf8_general_ci, user:root"] [command=Query] [status="inTxn:0, autocommit:1"] [sql="select * form t"] [txn_mode=PESSIMISTIC] [timestamp=0] [err="[parser:1064]You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use line 1 column 13 near \"form t\" "]

flink sql侧就是对着这个已经存在且有数据的tidb表,按照上放语句建表并select count(*) from MyUserTable.
image

另外我select * from MyUserTable; 是没问题的,flink sql不能对表直接select count(*)?还是我在flink侧建表时少了一些条件

直接到 tidb 服务器或者 dashboard 中,去匹配。找相关 SQL。
关键字是:command dispatched failed。
tidb.log 日志中应该有的

select count(id) from MyUserTable;也一样不行 ,对应collect job会一直restart。
但是select count(distinct id) from MyUserTable; 就可以 很快有结果反馈


这图就是上方一些select count(*)的日志,感觉并不是语法错误,users是tidb侧该表的名字,MyUserTable是flink sql侧的表名

image
已经很明显了,select 和 from 之间,没有 *

这条日志对应的实际是select count(*) from MyUserTable; 也就是说这条sql在flink侧输入后,最后在tidb侧被解析为了 select from users吧?

这不是数据库解析成了这个 SQL,这是 应用发的 SQL 就是这样的
数据库解析不了,问题出在前面。

是的,看来问题在flink和我用的sql上,后面我换别的场景和flink对接再试试:expressionless:

1 个赞

数据源切换成mysql会不会有问题?

应该不会,兼容呢

确实和flink版本有关,估计用已发布版本就不会有这种问题。但是用的前一段时间自己编译的flink1.15.2,不管flink sql查询mysql还是tidb都有这个情况,应该很好复现

那确定了是flink那就简单多了。看你用1.15应该不是生产环境,还是建议用1.14以下