Superset版本 1.3.0
查询结果会比正确结果少两条数据
首先我先讲述我是如何发现这个问题的,准确的说是运营如何发现这个问题的。
数据有四列,分别是’Time’ ‘pid’ ‘eid’ ‘cnt’ ,首先我们在clickhouse客户端进行操作,其中我限定pid=’609’,然后eid进行group by 操作,然后sum(cnt),可以看到数据有三条
我从superset进行同样的操作,需要注意的是我上面在clickhouse客户端操作的SQL就是在superset上操作view sql生成的SQL语句,所以他们肯定是相同的操作。
可以看到superset只有一条结果返回,经过我监控query_log日志中的SQL语句发现superset请求的SQL语句确实没有什么问题,但是他在接收到结果之后进行了一些操作会导致数据少两条。
经过多方排查以及询问,发现最后是superset连接clickhouse使用的协议导致的,首先superset连接clickhouse使用的是开源的第三方的库叫做 clickhouse-sqlalchemy ,它支持两种连接clickhouse的协议,分别是http以及native(TCP)协议其中我们默认使用的是http协议,反映出来的url就是这么写 :
clickhouse://bigdata:XXXXXXXXXX@127.0.0.1:8123/default
还有一种native(TCP)协议,它的url是这么写,需要注意的是必须要去掉端口号,加上端口号superset不能正常解析。
clickhouse+native://bigdata:XXXXXXXXXX@127.0.0.1/default
而第一种协议需要我们在执行底层查询的时候指定查询结果的format,否则返回的结果就是不正确的。
https://github.com/xzkostyan/clickhouse-sqlalchemy/issues/14#issuecomment-390755088
改用第二种native的形式并且去掉端口号之和superset返回的数据和clickhouse客户端一致了。
参考连接:
https://github.com/apache/superset/issues/15190
https://github.com/xzkostyan/clickhouse-sqlalchemy/issues/14
- Post title:Superset查询会丢数据问题排查
- Post author:刘梦凯
- Create time:2021-10-18 20:22:01
- Post link:https://liumengkai.github.io/2021/10/18/Superset查询会丢数据问题排查/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.