ClickHouse(十五):Clickhouse MergeTree系列表引擎 - AggregatingMergeTree

news2024/10/7 14:26:18

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

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

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

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

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

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


目录

1. AggregatingMergeTree建表语句

2. 示例一

3. 示例二


该表引擎继承自MergeTree,可以使用 AggregatingMergeTree 表来做增量数据统计聚合。如果要按一组规则来合并减少行数,则使用 AggregatingMergeTree 是合适的。AggregatingMergeTree是通过预先定义的聚合函数计算数据并通过二进制的格式存入表内。

与SummingMergeTree的区别在于:SummingMergeTree对非主键列进行sum聚合,而AggregatingMergeTree则可以指定各种聚合函数。对某些字段需要进行聚合时,需要在创建表字段时指定成AggregateFunction类型。

1. AggregatingMergeTree建表语句

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]

(

    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],

    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],

    ...

) ENGINE = AggregatingMergeTree()

[PARTITION BY expr]

[ORDER BY expr]

[SAMPLE BY expr]

[TTL expr]

[SETTINGS name=value, ...]

2. 示例一

#创建表 t_aggregating_mt ,使用AggregatingMergeTree引擎,指定salary字段是聚合字段

node1 :) create table t_aggregating_mt(

:-] id UInt8,

:-] name String,

:-] age UInt8,

:-] loc String,

:-] dept String,

:-] workdays UInt8,

:-] salary AggregateFunction(sum,Decimal32(2))

:-] ) engine = AggregatingMergeTree()

:-] order by (id,age)

:-] primary key id

:-] partition by loc;
  • 注意:

对于AggregateFunction类型的列字段,在进行数据的写入和查询时与其他的表引擎有很大区别,在写入数据时,需要调用 *-State 函数;而在查询数据时,则需要调用相应的 *-Merge 函数。

对于上面的建表语句而言,需要使用sumState函数进行数据插入。

#向表 t_aggregating_mt 中插入数据,插入方式与之前方式不同

node1 :) insert into t_aggregating_mt select 1,'张三',18,'北京','java',18,sumState(toDecimal32(10000,2));

node1 :) insert into t_aggregating_mt select 2,'李四',19,'上海','java',22,sumState(toDecimal32(8000,2));

node1 :) insert into t_aggregating_mt select 3,'王五',20,'北京','java',26,sumState(toDecimal32(12000,2));

查询数据时,如果正常语句查询,aggregateFunction类型的列不会正常显示数据,针对以上的数据需要使用sumMerge来展示数据。

#错误方式查询表 t_aggregating_mt 中的数据

node1 :) select * from t_aggregating_mt; 

┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬─salary─┐

│  1  │ 张三  │  18  │ 北京  │ java │       18  │ @B      │

└────┴──────┴─────┴──────┴──────┴──────────┴────────┘

┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬─salary─┐

│  2 │ 李四  │  19  │ 上海  │ java  │       22  │ 5       │

└────┴──────┴─────┴──────┴──────┴──────────┴────────┘

┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬─salary─┐

│  3  │ 王五  │  20 │ 北京  │  java │       26  │ O       │

└────┴──────┴─────┴──────┴──────┴──────────┴────────┘



#正确方式查询表 t_aggregating_mt中的数据,注意需要跟上groupBy

node1 :) select * ,sumMerge(salary) from t_aggregating_mt group by id,name ,age, loc,dept,workdays,salary ;

┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬─salary─┬─sumMerge(salary)─┐

│  1 │ 张三   │  18 │ 北京  │ java  │       18  │ @B      │         10000.00   │

│  3 │ 王五   │  20 │ 北京  │ java  │       26  │ O       │         12000.00   │

│  2 │ 李四   │  19 │ 上海  │ java  │       22  │ 5       │          8000.00   │

└────┴──────┴─────┴──────┴──────┴──────────┴────────┴──────────────────┘

向表中插入排序字段相同的数据进行分区聚合时,数据按照建表指定的聚合字段进行合并,其他的非聚合字段会保留最初的那条数据,新插入的数据对应的字段值会被舍弃。

# 向表中插入新的一条数据

node1 :) insert into t_aggregating_mt select 1,'张三三',18,'北京','前端',22,sumState(toDecimal32(5000,2));



#查询表中的数据,这里为了方便看到分区不合并,直接查询

┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬─salary─┐

│  3  │ 王五  │  20 │ 北京   │ java │       26  │ O       │

└────┴──────┴─────┴──────┴──────┴──────────┴────────┘

┌─id─┬─name───┬─age─┬─loc──┬─dept─┬─workdays─┬─salary─┐

│  1  │ 张三三  │  18  │ 北京  │ 前端   │       22  │  ¡      │

└────┴────────┴─────┴──────┴──────┴──────────┴────────┘

┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬─salary─┐

│  2  │ 李四  │  19 │ 上海  │ java  │       22  │ 5       │

└────┴──────┴─────┴──────┴──────┴──────────┴────────┘

┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬─salary─┐

│  1 │ 张三  │  18  │ 北京  │ java  │       18  │ @B      │

└────┴──────┴─────┴──────┴──────┴──────────┴────────┘



#使用optimize 命令合并相同分区数据

node1 :) optimize table t_aggregating_mt;



#再次查询表 t_aggregating_mt 表数据,salary 字段已经按照相同分区数据聚合

node1 :) select *,sumMerge(salary)  from t_aggregating_mt group by id,name ,age,loc,dept,workdays,salary;

┌─id─┬─name─┬─age─┬─loc──┬─dept─┬─workdays─┬─salary─┬─sumMerge(salary)─┐

│  1  │ 张三  │  18 │ 北京  │ java  │       18  │ `ᔠ      │         15000.00  │

│  3  │ 王五  │  20 │ 北京  │ java  │       26  │ O        │         12000.00  │

│  2  │  李四 │  19 │ 上海  │ java  │       22  │ 5        │          8000.00  │

└────┴──────┴─────┴──────┴──────┴──────────┴────────┴──────────────────┘

以上方式使用AggregatingMergeTree表引擎比较不方便,更多情况下,我们将AggregatingMergeTree作为物化视图的表引擎与MergeeTree搭配使用。

3. 示例二

#创建表 t_merge_base 表,使用MergeTree引擎

node1 :) create table t_merge_base(

:-] id UInt8,

:-] name String,

:-] age UInt8,

:-] loc String,

:-] dept String,

:-] workdays UInt8,

:-] salary Decimal32(2)

:-] )engine = MergeTree()

:-] order by (id,age)

:-] primary key id

:-] partition by loc;



#创建物化视图 view_aggregating_mt ,使用AggregatingMergeTree引擎

node1 :) create materialized view  view_aggregating_mt

:-] engine = AggregatingMergeTree() 

:-] order by id 

:-] as select 

:-] id,

:-] name,

:-] sumState(salary) as ss

:-] from t_merge_base

:-] group by id ,name ;





#向表 t_merge_base 中插入数据

node1 :) insert into t_merge_base values (1,'张三',18,'北京','大数据',24,10000),

:-] (2,'李四',19,'上海','java',22,8000),

:-] (3,'王五',20,'北京','java',26,12000);



#查看 view_aggregating_mt视图数据

node1 :) select *,sumMerge(ss)  from view_aggregating_mt group by id,name,ss;

┌─id─┬─name─┬─ss─┬─sumMerge(ss)─┐

│  2  │ 李四  │ 5  │      8000.00   │

│  3  │ 王五  │ O  │     12000.00   │

│  1  │ 张三  │ @B │     10000.00  │

└────┴──────┴────┴──────────────┘



#继续向表 t_merge_base中插入排序键相同的数据

node1 :) insert into t_merge_base values (1,'张三三',18,'北京','前端',22,5000);



#手动执行optimize 命令,合并物化视图 view_aggregating_mt 相同分区数据

node1 :) optimize table view_aggregating_mt;



#查询视图 view_aggregating_mt数据

node1 :) select *,sumMerge(ss)  from view_aggregating_mt group by id,name,ss;

┌─id─┬─name─┬─ss─┬─sumMerge(ss)─┐

│  2  │ 李四  │ 5  │      8000.00   │

│  1  │ 张三  │ `ᔠ│     15000.00   │

│  3  │ 王五  │ O  │     12000.00   │

└────┴──────┴────┴──────────────┘



注意:通过普通MergeTree表与AggregatingMergeTree物化视图结合使用,MergeTree中存放原子数据,物化视图中存入聚合结果数据,可以提升数据查询效率。

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


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VMnet0 桥接设置

VMnet0 一定要设置为你的硬件物理网卡,不能设置自动,不然后,网线一断,就再也连不上了。必须重启电脑才能连上,这个问题找了很久才找到。 下面有个hyper-V虚拟网卡,如果选自动的话,物理网卡一掉…

关于MySQL中的binlog

介绍 undo log 和 redo log是由Inno DB存储引擎生成的。 在MySQL服务器架构中,分为三层:连接层、服务层(server层)、执行层(存储引擎层) bin log 是 binary log的缩写,即二进制日志。 MySQL…

交叉编译详细版总结

1.交叉编译 交叉编译:在一个平台生成另外一个平台可执行的代码。 编译:在一个平台上生成在该平台上的可执行代码。 C51/32 交叉编译发送在Keil(集成环境上面),windows上面编写51/32代码 ,不是在windows上面运行 在…

[QT编程系列-41]:Qt QML与Qt widget 深入比较,快速了解它们的区别和应用场合

目录 1. Qt QML与Qt widget之争 1.1 出现顺序 1.2 性能比较 1.3 应用应用领域 1.4 发展趋势 1.5 QT Creator兼容上述两种设计风格 2. 界面描述方式的差别 3. QML和Widgets之间的一些比较 4. 选择QML和Widgets之间的Qt技术时,可以考虑以下几个因素&#xff…

protobuf中zigzag编码原理

前面两篇博客 varint原理 - 正数的编码和解码_YZF_Kevin的博客-CSDN博客 varint原理 - 负数的编码和解码_YZF_Kevin的博客-CSDN博客 我们分析了varint对正数,负数的编码解码方式,也知道了如果用varint表示负数的坑,那就是负数直接占10个字…

代码随想录二刷博客Day3~Day4

707. 设计链表 这道题的解题思路其实就是让我们模拟一个链表的实现: 首先我们先要创建一个内部类作为链表的结点,这个内部类要包含两个元素,一个是val值,一个是指向下一个节点的指针 在构造方法这里我们要初始化一个虚拟头街点…

解决页面是Whitelabel Error Page方法之一

在网上随便一搜都能搜到很多当页面是Whitelabel Error Page时的解决方法,这里就不一一赘述了,如果试过了各种方法都不能解决,可以看看我这个解决方法,看看是不是和我的情况相同 我这个bug出现的前提是,SpringBoot项目…

三种方法实现tab栏切换(CSS方法、JS方法、Vue方法)

一、需求 给下图的静态页面添加tab栏切换效果 二、CSS方法 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"v…

人工智能的未来:探索下一代生成模型

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 生成式 AI 目前能够做什么&#xff0c;以及探索下一波生成式 AI 模型需要克服的当前挑战&#xff1f; 如果你跟上科技世界的步伐&#xff0c;你就会知道生成式人工智能是最热门的话题。我们听到了很多关于…

C语言案例 判断是否为回文数-06

题目&#xff1a;随机输入一个5位数&#xff0c;判断它是不是回文数 步骤一&#xff1a;定义程序的目标 编写C程序&#xff0c;随机输入一个5位数&#xff0c;判断它是不是回文数 步骤二&#xff1a;程序设计 原理&#xff1a;即12321是回文数&#xff0c;个位与万位相同&#…

echarts甘特图 一个值多条线

先看图 这里我们用到的是 series &#xff1a;type:custom 自定义&#xff0c;但是这里我遇到一个问题&#xff0c;就是不过你在series里push多少数据&#xff0c;图表上显示的都是在同一水平线&#xff0c;用了好多方法都不好使&#xff0c; renderItem: (params, api) >…

ModaHub魔搭社区——GPTCache 的工作原理

GPTCache 模块化的架构设计方便用户定制个性化语义缓存。每个模块都提供多种选择,适合各种应用场景。 大语言模型适配器: 适配器将大语言模型请求转换为缓存协议,并将缓存结果转换为 LLM 响应。适配器方便轻松集成所有大语言模型,并可灵活扩展。GPTCache 支持多种大语言模型…

【雕爷学编程】Arduino动手做(199)---8x32位WS2812B全彩屏模块4

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

如何构建高级的浅色和深色主题切换

通过这个实例我们主要是掌握如下知识点 灵活使用 CSS 变量使用 JS 获取 CSS 变量灵活使用 CSS 的transform和transition属性 效果图 实现页面布局 从效果图我们首先可以实现页面的大致布局&#xff0c;具体的代码如下&#xff1a; <h2 class"main-title">主…

接口测试总结分享(http与rpc)

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 一、了解一下HTTP与RPC 1. HTTP&#xff08;H…

Stable Diffuion webui Mac版本安装过程

系统环境 操作系统&#xff1a;MacOS Ventura13.5 芯片&#xff1a;Apple M2 Max Python: 3.10 安装前置准备 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git注意事项&#xff1a;修改源码内全部 git clone 链接&#xff0c;设置代理 https://ghpr…

C++——模板简要介绍

首先给出一个栈的类 class Stack { public:Stack(size_t capacity 4)//不传入值则就默认4个空间&#xff0c;&#xff08;构造函数&#xff09;{cout << "Stack(size_t n 4)" << endl;_a new DataType[capacity];_capacity capacity;_top 0;}~Stac…

【雕爷学编程】Arduino动手做(199)---8x32位WS2812B全彩屏模块3

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

【Vue3】插槽全家桶

插槽&#xff08;Slots&#xff09;是 Vue.js 框架中的一个功能&#xff0c;允许在组件内部预留一些可替换的内容。通过插槽&#xff0c;可以给父组件填充模板代码&#xff0c;让父组件向子组件传递自定义的内容&#xff0c;以便在子组件中进行展示或处理。 1. 匿名插槽 Son.…

使用chatGPT应用于人力资源行业

在当今快速发展的技术环境中&#xff0c;人力资源专业人员保持技术领先和意识领先至关重要。采用创新工具&#xff0c;如OpenAI的ChatGPT&#xff0c;充分利用其强大的力量&#xff0c;可能会改变整个行业的游戏规则。 提高招聘流程的人力效率 如果能够实现招聘流程自动化&am…