ClickHouse(十四):Clickhouse MergeTree系列表引擎 - SummingMergeTree

 进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容!

🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客

📌订阅:拥抱独家专题,你的订阅将点燃我的创作热情!

👍点赞:赞同优秀创作,你的点赞是对我创作最大的认可!

⭐️ 收藏:收藏原创博文,让我们一起打造IT界的荣耀与辉煌!

✏️评论:留下心声墨迹,你的评论将是我努力改进的方向!


目录

1. SummingMergeTree建表语句

2. 示例

2.1 测试不指定聚合字段同时测试不同分区内,相同排序key数据不会被合并

2.2 测试指定一个聚合字段

2.3 测试指定多个聚合字段


该引擎继承了MergeTree引擎,当合并 SummingMergeTree 表的数据片段时,ClickHouse 会把所有具有相同主键的行合并为一行,该行包含了被合并的行中具有数值数据类型的列的汇总值,即如果存在重复的数据,会对对这些重复的数据进行合并成一条数据,类似于group by的效果,可以显著减少存储空间并加快数据查询速度。

如果用户只需要查询数据的汇总结果,不关心明细数据,并且数据的汇总条件是预先明确的,即GROUP BY的分组字段是确定的,可以使用该表引擎。

1. SummingMergeTree建表语句

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster](name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],...) ENGINE = SummingMergeTree([columns])[PARTITION BY expr][ORDER BY expr][SAMPLE BY expr][SETTINGS name=value, ...]

对以上建表语句的解释如下:

  • [columns]: 将要被汇总的列,或者多个列,多个列需要写在元组中。可选参数。所选的列必须是数值类型,并且不可位于主键中。如果没有指定 [columns],ClickHouse 会把所有不在主键中的数值类型的列都进行汇总。

使用SummingMergeTree注意以下几点:

  • SummingMergeTree是根据什么对两条数据进行合并的

用ORBER BY排序键作为聚合数据的条件Key。即如果排序key是相同的,则会合并成一条数据,并对指定的合并字段进行聚合。

  • 仅对分区内的相同排序key的数据行进行合并

以数据分区为单位来聚合数据。当分区合并时,同一数据分区内聚合Key相同的数据会被合并汇总,而不同分区之间的数据则不会被汇总。

  • 如果没有指定聚合字段,会怎么聚合

如果没有指定聚合字段,则会按照非主键的数值类型字段进行聚合。

  • 对于非汇总字段的数据,该保留哪一条

如果两行数据除了排序字段相同,其他的非聚合字段不相同,那么在聚合发生时,会保留最初的那条数据,新插入的数据对应的那个字段值会被舍弃。

2. 示例

2.1 测试不指定聚合字段同时测试不同分区内,相同排序key数据不会被合并

#创建表 t_summing_mt ,使用SummingMergeTree表引擎node1 :) create table t_summing_mt(:-] id UInt8,:-] name String,:-] age UInt8,:-] loc String,:-] dept String,:-] workdays UInt8,:-] salary Decimal32(2):-] ) engine = SummingMergeTree():-] order by (id,age):-] primary key id:-] partition by loc;#向表 t_summing_mt 中插入以下数据node1 :) insert into t_summing_mt values (1,'张三',18,'北京','大数据',24,10000),:-] (2,'李四',19,'上海','java',22,8000),:-] (3,'王五',20,'北京','java',26,12000);#查看表 t_summing_mt 中的数据node1 :) select * from t_summing_mt;┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐│  1  │ 张三  │  18 │ 北京   │ 大数据  │       24   │ 10000.00 ││  3  │ 王五  │  20 │ 北京   │ java   │       26   │ 12000.00 │└────┴──────┴─────┴──────┴────────┴──────────┴──────────┘┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐│  2  │ 李四  │  19 │ 上海   │ java │       22  │ 8000.00 │└────┴──────┴─────┴──────┴──────┴──────────┴─────────┘#向表 t_summing_mt 中插入一条排序键相同的数据node1 :) insert into t_summing_mt values (1,'马六',18,'北京','前端',27,15000);#查看表 t_summing_mt中的数据node1 :) select * from t_summing_mt;┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐│  1  │ 张三  │  18 │ 北京  │ 大数据   │       24   │ 10000.00 ││  3  │ 王五  │  20 │ 北京  │ java    │       26   │ 12000.00 │└────┴──────┴─────┴──────┴────────┴──────────┴──────────┘┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬───salary─┐│  1  │ 马六  │  18  │ 北京  │ 前端  │       27   │ 15000.00 │└────┴──────┴─────┴──────┴──────┴──────────┴──────────┘┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐│  2  │ 李四  │  19 │ 上海  │ java  │       22  │ 8000.00 │└────┴──────┴─────┴──────┴──────┴──────────┴─────────┘#手动执行optimize 命令触发合并相同分区数据node1 :) optimize table t_summing_mt;#查看表 t_summing_mt 中的数据node1 :) select * from t_summing_mt;┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐│  1  │ 张三  │  18  │ 北京  │ 大数据  │       51   │ 25000.00 ││  3  │ 王五  │  20  │ 北京  │ java   │       26   │ 12000.00 │└────┴──────┴─────┴──────┴────────┴──────────┴──────────┘┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐│  2  │ 李四  │  19  │ 上海  │ java │       22  │ 8000.00 │└────┴──────┴─────┴──────┴──────┴──────────┴─────────┘注意:我们可以看到当不指定 聚合字段时,有相同排序字段行进行聚合时,会将数值类型的字段进行聚合合并。#继续向表 t_summing_mt中插入以下数据:node1 :) insert into t_summing_mt values (1,'张三',18,'南京','java',18,12000);#查看表 t_summing_mt中的数据node1 :) select * from t_summing_mt;┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬───salary─┐│  1  │ 张三  │  18 │ 南京  │ java  │       18  │ 12000.00 │└────┴──────┴─────┴──────┴──────┴──────────┴──────────┘┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐│  1  │ 张三  │  18 │ 北京  │ 大数据   │       51  │ 25000.00 ││  3  │ 王五  │  20 │ 北京  │ java     │       26 │ 12000.00 │└────┴──────┴─────┴──────┴────────┴──────────┴──────────┘┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐│  2  │ 李四  │  19 │ 上海  │ java │       22   │ 8000.00 │└────┴──────┴─────┴──────┴──────┴──────────┴─────────┘#手动指定optimize 命令合并相同排序key的数据node1 :) optimize table t_summing_mt;#查看表 t_summing_mt中的数据node1 :) select * from t_summing_mt;┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬───salary─┐│  1  │ 张三  │  18 │ 南京  │ java  │       18  │ 12000.00 │└────┴──────┴─────┴──────┴──────┴──────────┴──────────┘┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐│  1  │ 张三  │  18 │ 北京  │ 大数据   │       51  │ 25000.00 ││  3  │ 王五  │  20 │ 北京  │ java     │       26 │ 12000.00 │└────┴──────┴─────┴──────┴────────┴──────────┴──────────┘┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐│  2  │ 李四  │  19 │ 上海  │ java │       22   │ 8000.00 │└────┴──────┴─────┴──────┴──────┴──────────┴─────────┘注意:不同分区内相同的排序key的数据不能被合并

2.2 测试指定一个聚合字段

#删除表 t_summing_mt,重新创建表 t_summing_mt ,使用SummingMergeTree引擎node1 :) create table t_summing_mt(:-] id UInt8,:-] name String,:-] age UInt8,:-] loc String,:-] dept String,:-] workdays UInt8,:-] salary Decimal32(2):-] ) engine = SummingMergeTree(salary):-] order by (id,age):-] primary key id:-] partition by loc;#向表 t_summing_mt 中插入以下数据node1 :) insert into t_summing_mt values (1,'张三',18,'北京','大数据',24,10000),:-] (2,'李四',19,'上海','java',22,8000),:-] (3,'王五',20,'北京','java',26,12000);#查看表 t_summing_mt 中的数据node1 :) select * from t_summing_mt;┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐│  1  │ 张三  │  18 │ 北京   │ 大数据  │       24   │ 10000.00 ││  3  │ 王五  │  20 │ 北京   │ java   │       26   │ 12000.00 │└────┴──────┴─────┴──────┴────────┴──────────┴──────────┘┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐│  2  │ 李四  │  19 │ 上海   │ java │       22  │ 8000.00 │└────┴──────┴─────┴──────┴──────┴──────────┴─────────┘#向表 t_summing_mt 中插入一条排序键相同的数据node1 :) insert into t_summing_mt values (1,'马六',18,'北京','前端',27,15000);#查看表 t_summing_mt中的数据node1 :) select * from t_summing_mt;┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐│  1  │ 张三  │  18 │ 北京  │ 大数据   │       24   │ 10000.00 ││  3  │ 王五  │  20 │ 北京  │ java    │       26   │ 12000.00 │└────┴──────┴─────┴──────┴────────┴──────────┴──────────┘┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬───salary─┐│  1  │ 马六  │  18  │ 北京  │ 前端  │       27   │ 15000.00 │└────┴──────┴─────┴──────┴──────┴──────────┴──────────┘┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐│  2  │ 李四  │  19 │ 上海  │ java  │       22  │ 8000.00 │└────┴──────┴─────┴──────┴──────┴──────────┴─────────┘#手动执行optimize 命令触发合并相同分区数据node1 :) optimize table t_summing_mt;#查看表 t_summing_mt 中的数据node1 :) select * from t_summing_mt;┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐│  1  │ 张三  │  18  │ 北京  │ 大数据  │       24   │ 25000.00 ││  3  │ 王五  │   20 │ 北京  │ java   │       26   │ 12000.00 │└────┴──────┴─────┴──────┴────────┴──────────┴──────────┘┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐│  2  │ 李四  │  19  │ 上海  │ java │       22  │ 8000.00 │└────┴──────┴─────┴──────┴──────┴──────────┴─────────┘注意:我们可以看到当指定一个聚合字段时,有相同排序字段行进行聚合时,会按照这个数值字段进行合并,其他的保留最开始一条数据的信息。

2.3 测试指定多个聚合字段

#删除表 t_summing_mt,重新创建表 t_summing_mt ,使用SummingMergeTree引擎node1 :) create table t_summing_mt(:-] id UInt8,:-] name String,:-] age UInt8,:-] loc String,:-] dept String,:-] workdays UInt8,:-] salary Decimal32(2):-] ) engine = SummingMergeTree((salary,workdays)):-] order by (id,age):-] primary key id:-] partition by loc;#向表 t_summing_mt 中插入以下数据node1 :) insert into t_summing_mt values (1,'张三',18,'北京','大数据',24,10000),:-] (2,'李四',19,'上海','java',22,8000),:-] (3,'王五',20,'北京','java',26,12000);#查看表 t_summing_mt 中的数据node1 :) select * from t_summing_mt;┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐│  1  │ 张三  │  18 │ 北京   │ 大数据  │       24   │ 10000.00 ││  3  │ 王五  │  20 │ 北京   │ java   │       26   │ 12000.00 │└────┴──────┴─────┴──────┴────────┴──────────┴──────────┘┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐│  2  │ 李四  │  19 │ 上海   │ java │       22  │ 8000.00 │└────┴──────┴─────┴──────┴──────┴──────────┴─────────┘#向表 t_summing_mt 中插入一条排序键相同的数据node1 :) insert into t_summing_mt values (1,'马六',18,'北京','前端',27,15000);#查看表 t_summing_mt中的数据node1 :) select * from t_summing_mt;┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐│  1  │ 张三  │  18 │ 北京  │ 大数据   │       24   │ 10000.00 ││  3  │ 王五  │  20 │ 北京  │ java    │       26   │ 12000.00 │└────┴──────┴─────┴──────┴────────┴──────────┴──────────┘┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬───salary─┐│  1  │ 马六  │  18  │ 北京  │ 前端  │       27   │ 15000.00 │└────┴──────┴─────┴──────┴──────┴──────────┴──────────┘┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐│  2  │ 李四  │  19 │ 上海  │ java  │       22  │ 8000.00 │└────┴──────┴─────┴──────┴──────┴──────────┴─────────┘#手动执行optimize 命令触发合并相同分区数据node1 :) optimize table t_summing_mt;#查看表 t_summing_mt 中的数据node1 :) select * from t_summing_mt;┌─id─┬─name─┬─age─┬─loc──┬─dept───┬─workdays─┬───salary─┐│  1  │ 张三  │  18  │ 北京  │ 大数据  │       51   │ 25000.00 ││  3  │ 王五  │   20 │ 北京  │ java   │       26   │ 12000.00 │└────┴──────┴─────┴──────┴────────┴──────────┴──────────┘┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬──salary─┐│  2  │ 李四  │  19  │ 上海  │ java │       22  │ 8000.00 │└────┴──────┴─────┴──────┴──────┴──────────┴─────────┘注意:我们可以看到当指定多个聚合字段时,有相同排序字段行进行聚合时,会按照指定的多个数值字段进行合并,其他的保留最开始一条数据的信息。

👨‍💻如需博文中的资料请私信博主。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/80401.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

做好“关键基础设施提供商”角色,亚马逊云科技加快生成式AI落地

一场关于生产力的革命已在酝酿之中。全球管理咨询公司麦肯锡在最近的报告《生成式人工智能的经济潜力:下一波生产力浪潮》中指出,生成式AI每年可能为全球经济增加2.6万亿到4.4万亿美元的价值。在几天前的亚马逊云科技纽约峰会中,「生成式AI」…

「从零入门推荐系统」22:chatGPT、大模型在推荐系统中的应用

作者 | gongyouliu 编辑 | gongyouliu 提示:全文2.5万字,预计阅读时长2小时,可以先收藏再慢慢阅读。 我们在上一章介绍了chatGPT、大模型的基本概念、核心技术原理等基础知识,有了这些背景知识的铺垫,下面我们来介绍ch…

[C++项目] Boost文档 站内搜索引擎(2): 文档文本解析模块parser的实现、如何对文档文件去标签、如何获取文档标题...

项目开始的准备工作 在上一篇文章中, 已经从Boost官网获取了Boost库的源码. 相关文章: 🫦[C项目] Boost文档 站内搜索引擎(1): 项目背景介绍、相关技术栈、相关概念介绍… 接下来就要编写代码了. 不过还需要做一些准备工作. 创建项目目录 所有的项目文件肯定要在一…

Linux系统---进程控制

文章目录 进程创建进程终止进程等待进程替换实现简单的mini-shell 一、进程创建 1.fork()函数 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 #include <unistd.h> pid_t fork(void…

数据结构日记之《队列的定义》

队列的定义 一、队列的定义和特点二、队列的抽象数据类型定义三、例子 一、队列的定义和特点 队列 (queue) 是一种 先进先出(First In First Out, FIFO) 的线性表。它只允许在表的一端进行插入&#xff0c;而在另一端删除元素。这和日常生活中的排队是一致的&#xff0c;最早进…

Storm学习之使用官方Docker镜像快速搭建Storm运行环境

文章目录 0.前言搭建完的效果 1.教程1.1.docker 安装 zookeeper1.2. 安装 storm nimbus1.3.docker 安装 supervisor1.4.docker 安装 storm-ui1.5.查看已经启动的容器1.6.提交topology到 storm集群 2.总结3.参考文档 0.前言 Apache Storm 官方也出了Docker 镜像 https://hub.do…

Bootload U-Boot分析

Bootloader是在操作系统运行之前执行的一段小程序。通过这段小程序可以初始化硬件设备、建立内存空间的映射表&#xff0c;从而建立适当的系统软硬件环境&#xff0c;为最终调用操作系统内核做好准备。 对于嵌入式系统&#xff0c;Bootloader是基于特定硬件平台来实现的。因此…

SSE技术和WebSocket技术实现即时通讯

文章目录 一、SSE1.1 什么是SSE1.2 工作原理1.3 特点和适用场景1.4 API用法1.5 代码实现 二、WebSocket2.1 什么是WebSocket2.2 工作原理2.3 特点和适用场景2.4 API用法2.5 代码实现2.6 心跳检测 三、SSE与WebSocket的比较 当涉及到实现实时通信的Web应用程序时&#xff0c;两种…

记录--说一说css的font-size: 0

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 平常我们说的font-size&#xff1a;0&#xff1b;就是设置字体大小为0对吧&#xff0c;但是它的用处不仅仅如此哦&#xff0c;它还可以消除子行内元素间额外多余的空白&#xff01; 问题描述&#xff…

芒格之道——查理·芒格股东会讲话1987-2022

你越是认真生活&#xff0c;你的生活就会越美好&#xff01; 这里将读书过程划线的内容摘抄在这里&#xff0c;方便自己回顾。 书分为两部分&#xff0c;我先读了后半部分&#xff0c;而且是从后往前读&#xff0c;到了前半部分&#xff0c;我是从前往后读。书还挺贵&#xff…

K8S系列文章 之 容器存储基础 Volume

Volume Volume是容器数据卷。我们经常创建删除一些容器&#xff0c;但有时候需要保留容器中的一些数据&#xff0c;这时候就用到了Volume。它也是容器之间数据共享的技术&#xff0c;可以将容器中产生的数据同步到本地。实际就是把容器中的目录挂载到运行着容器的服务器或个人…

在 Ubuntu 上安装 Docker 桌面

Ubuntu 22.04 (LTS) 安装 Docker 桌面 要成功安装 Docker Desktop&#xff0c;您必须&#xff1a; 满足系统要求拥有 64 位版本的 Ubuntu Jammy Jellyfish 22.04 (LTS) 或 Ubuntu Impish Indri 21.10。对于非 Gnome 桌面环境&#xff0c;必须安装 gnome-terminal&#xff1a;…

Docker 安装 Tomcat

目录 一、查看 tomcat 版本 二、拉取 Tomcat Docker 镜像 三、创建 Tomcat 容器 四、访问 Tomcat 五、停止和启动容器 一、查看 tomcat 版本 访问 tomcat 镜像库地址&#xff1a;https://hub.docker.com/_/tomcat&#xff0c;可以通过 Tags 查看其他版本的 tomcat; 二、拉…

FreeRTOS的线程间通信

一、分类 FreeRTOS的线程间通信分为这几大类 由于我还在学习中&#xff0c;目前显从信号开始记录学习 二、逐块讲解 1、信号&#xff08;osSignalWait osSignalSet&#xff09; FreeRTOS从V8.2.0版本开始提供任务通知这个功能&#xff0c;每个任务多有一个32位的通知值&am…

windows环境下如何更改pip安装的默认位置

1.查看配置信息 python -m site2.查看配置文件位置 python -m site -help3.修改配置文件 USER_SITE "D:\\soft\\Anaconda\\Lib\\site-packages" USER_BASE "D:\\soft\\Anaconda\\Scripts"如果遇到文件无法保存情况&#xff0c;请给用户增加权限。 4.…

第十五章 定义 HL7 的 DTL 数据转换

文章目录 第十五章 定义 HL7 的 DTL 数据转换 第十五章 定义 HL7 的 DTL 数据转换 每个接口可能需要一定数量的数据转换。创建转换时&#xff0c;不要使用保留的包名称。 重要提示&#xff1a;请勿在数据转换中手动更改 HL7 转义序列&#xff1b;自动处理这些。 可以使用“数…

DNS部署与安全详解(上)

文章目录 一、DNS二、域名组成1. 域名组成概述2. 域名组成 三、监听端口四、DNS解析种类1. 按照查询方式分类&#xff1a;2. 按照查询内容分类&#xff1a; 五、DNS服务器搭建过程1. 先确保服务器的IP地址是固定的2. 安装DNS软件 一、DNS DNS全称Domain Name Service&#xff0…

pycharm打开terminal报错

Pycharm打开终端报错如何解决&#xff1f;估计是终端启动conda不顺利&#xff0c;需要重新设置路径。参考以下文章的做法即可。 Windows下Pycharm中Terminal无法进入conda环境和Python Console 不能使用 给pycharm中Terminal 添加新的shell&#xff0c;才可以使用conda环境 W…

前端安全XSS和CSRF讲解

文章目录 XSSXSS攻击原理常见的攻击方式预防措施 CSRFCSRF攻击原理常见攻击情景预防措施&#xff1a; CSRF和XSS的区别 XSS 全称Cross Site Scripting&#xff0c;名为跨站脚本攻击。为啥不是单词第一个字母组合CSS&#xff0c;大概率与样式名称css进行区分。 XSS攻击原理 不…