最近在工作中使用到了clickhouse,在查询数据统计的时候遇到了一点问题,后来解决了,记录一下

ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统–DBMS ( 来自不同列的值被单独存储,来自同一列的数据被存储在一起 )

适用于大多数是读请求,数据较少更新或者没有更新的场景。clickhouse的一大优点是支持SQL, 在查询的学习成本上低于es.

SQL格式如下:

[WITH expr_list|(subquery)]
SELECT [DISTINCT] expr_list
[FROM [db.]table | (subquery) | table_function] [FINAL]
[SAMPLE sample_coeff]
[ARRAY JOIN ...]
[GLOBAL] [ANY|ALL|ASOF] [INNER|LEFT|RIGHT|FULL|CROSS] [OUTER|SEMI|ANTI] JOIN (subquery)|table (ON <expr_list>)|(USING <column_list>)
[PREWHERE expr]
[WHERE expr]
[GROUP BY expr_list] [WITH TOTALS]
[HAVING expr]
[ORDER BY expr_list] [WITH FILL] [FROM expr] [TO expr] [STEP expr]
[LIMIT [offset_value, ]n BY columns]
[LIMIT [n, ]m] [WITH TIES]
[UNION ALL ...]
[INTO OUTFILE filename]
[FORMAT format]

业务场景:
一批数据周期调用某个接口,每次调用的结果都会记录下来,想按照周期来统计该数据的调用结果。
每个周期内数据的唯一id是businessId,在同一周期内相同businessId的数据保留最新的一条作为统计数据源

SQL:对指定周期内的数据,统计其最新的business信息

SELECT * FROM db.t_data t1 inner join
(SELECT businessId , max(lastchangetime) lasttime FROM db.t_data where
lastchangetime >= toDateTime('?') and lastchangetime <= toDateTime('?')
and businessId >= ? and businessId <=? group by businessId) t2
on t1.businessId = t2.businessId and t1.lastchangetime = t2.lasttime

这个sql在MySQL执行是OK的,但是在clickhouse执行会报如下错误:"syntax error, expect {, actual error, pos 1, line 1, column 2Code: 288, e.displayText() = DB::Exception: Double-distributed IN/JOIN subqueries is denied (distributed_product_mode = 'deny'). You may rewrite query to use local tables in subqueries, or use GLOBAL keyword, or set distributed_product_mode to suitable value. (version 20.1.4.14 (official build))\n"

根据报错信息,因为不支持分布式子查询而发生如上报错,建议是在子查询里使用本地表或者使用GLOBAL, 我将inner join 改为global join 就没有报错了

那么clickhouse的分布式查询又是怎么一回事呢?

带子查询的IN-s有两个选项(类似于连接):normal IN / JOIN 和 GLOBAL IN / GLOBAL JOIN. 它们在分布式查询处理的运行方式上有所不同。

当使用常规IN时,查询被发送到远程服务器,并且它们中的每个服务器都在运行子查询 IN 或JOIN 条款

使用 GLOBAL IN / GLOBAL JOINs时,首先所有的子查询都运行 GLOBAL IN / GLOBAL
JOINs,并将结果收集在临时表中。 然后将临时表发送到每个远程服务器,其中使用此临时数据运行查询。

分布式子查询主要是用于在连接查询时,如果关联的数据分散在不同的集群中,那么子查询就需要先在所有集群节点上查询,然后以其并集作为子查询的结果集,否则查询出来的结果不准确。为了提高效率,官方是推荐使用global join(将 GLOBAL 修饰的子句,单独进行了一次分布式查询, 子查询的结果合并后存储在临时表中)代替普通的join。

参考资料:
ClickHouse概述
ClickHouse分布式IN & JOIN 查询的避坑指南
house.tech/docs/zh/sql-reference/operators/in/

记一次clickhouse查询问题Double-distributed IN/JOIN subqueries is denied (distributed_product_mode = ‘deny‘)相关推荐

  1. ClickHouse查询语句详解

    ​ClickHouse查询语句兼容大部分SQL语法,并且进行了更加丰富的扩展,查询语句模板如下: [WITH expr_list|(subquery)] SELECT [DISTINCT [ON (c ...

  2. 【clickhouse】clickhouse 利用Grafana与系统表监控ClickHouse查询

    文章目录 1.概述 1.概述 转载:利用Grafana与系统表监控ClickHouse查询 收藏从未停止,写在这里以防万一

  3. 【clickhouse】Clickhouse 查询之 Array JOIN

    文章目录 1.概述 1.概述 转载:Clickhouse 查询之 Array JOIN Array JOIN 子句允许在数据表的内部,与数组或者嵌套的字段进行JOIN操作,从而将一行数据变多行.适用于 ...

  4. 【clickhouse】clickhouse查询语句之simple

    文章目录 1. 概述 1. 概述 转载:Clickhouse查询语句 sample 注意: sample子句只能用于MergeTree系列引擎的数据表,并且在create table的时候就声明sam ...

  5. TPCH ClickHouse查询语句修改

    TPC-H 压CK的时候,22条query语句需要进行修改,使语法满足CK:在此记录,供参考 clickhouse查询语句-- query-1select l_returnflag, l_linest ...

  6. SQL 多表查询之 where和INNER JOIN

    SQL多表查询之 where和INNER JOIN[基础查询和效率分析] 转载Michaelwubo 最后发布于2018-07-05 10:40:47 阅读数 18057  收藏 https://bl ...

  7. SQL关联查询详解,SQL JOIN详解

    关联查询,也称为多表查询,指两个或更多个表一起完成查询操作. 前提条件:这些一起查询的表之间是有关系的(一对一.一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键. 一 ...

  8. Clickhouse 查询分布式表子查询 (Distributed Subqueries )

    官方文档:https://clickhouse.tech/docs/en/sql-reference/operators/in/#select-distributed-subqueries 在分布式表 ...

  9. ClickHouse 分布式原理:Distributed引擎

    文章目录 Distributed引擎 分布式写入流程 数据写入分片 副本复制数据 分布式查询流程 多副本的路由规则 多分片查询的流程 使用Global优化分布式子查询 Distributed引擎 Di ...

最新文章

  1. 不应该在ToString()方法中修改引用类型
  2. 2.06_Python网络爬虫_正则表达式
  3. python中文转拼音
  4. 【328天】每日项目总结系列066(2017.12.30)
  5. 苹果将明年上半年iPhone出货量目标提高 30%
  6. CodeFores 665D Simple Subset(贪心)
  7. MyCat分片规则之取模范围分片
  8. matlab 模拟滤波器,基于MATLAB的模拟滤波器设计
  9. Ubuntu 网易云音乐 Linux 官方版本下载安装
  10. android 免root 安装xposed,xposed框架免root安装|VAExposed(xposed框架免root版本)1.97最新版 - 维维软件园...
  11. VB简易绘图板的实现
  12. 正版软件 - AxMath 专业的数学公式编辑器带计算功能 数学公式编辑器首选工具
  13. 3. 项目立项三板斧-建议书-可行性研究-评估论证
  14. 2020届最新面试经验(腾讯and华为and百度)
  15. 在百度地图中叠加CAD图及GIS数据展示踩坑记
  16. 外星人 Alienware x15 R2 评测
  17. Linux 系统设置 : hwclock 命令详解
  18. 基于人工兔优化算法的函数寻优和工程优化
  19. Dubbo经典之作(Dubbo使用详解)
  20. 如何安装和配置Mantis

热门文章

  1. Redisson分布式锁实战-2:解决wait_time之坑
  2. 深入理解Kafka(4)-主题与分区
  3. java课后习题_【整理】java私塾教程课后习题
  4. win7安装oracle9i 补丁_最详细图解Windows7x64更新安装教程
  5. VMware Workstation 入门使用
  6. 什么是Session分布式共享
  7. VS2010+WinXP+MFC程序 无法定位程序输入点于动态链接库
  8. 扩展GridView控件——为内容项添加拖放及分组功能
  9. Jquery插件使用 焦点图插件 MyFocus ,另外记录一款插件 KinMaxShow大背景图插件。...
  10. Linux终端乱码的解决办法