AggregatingMergeTree引擎继承自 MergeTree,并改变了数据片段的合并逻辑。ClickHouse会将一个数据片段内所有具有相同主键(准确的说是排序键)的行替换成一行,这一行会存储一系列聚合函数的状态。

可以使用AggregatingMergeTree表来做增量数据的聚合统计,包括物化视图的数据聚合。

引擎使用以下类型来处理所有列:

  • AggregateFunction
  • SimpleAggregateFunction

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, ...]

AggregatingMergeTree表参数与MergeTree表是一致。MergeTree表引擎的解析可以参考ClickHouse(09)ClickHouse合并树MergeTree家族表引擎之MergeTree详细解析

查询和插入数据

要插入数据,需使用带有-State-聚合函数的INSERT或SELECT语句。从AggregatingMergeTree表中查询数据时,需使用GROUP BY子句并且要使用与插入时相同的聚合函数,但后缀要改为-Merge。

对于SELECT查询的结果,AggregateFunction类型的值对ClickHouse的所有输出格式都实现了特定的二进制表示法。在进行数据转储时,例如使用TabSeparated格式进行SELECT查询,那么这些转储数据也能直接用INSERT语句导回。

如下面的例子。

-- 创建一个AggregatingMergeTree物化视图
CREATE MATERIALIZED VIEW test.basic
ENGINE = AggregatingMergeTree() PARTITION BY toYYYYMM(StartDate) ORDER BY (CounterID, StartDate)
AS SELECT
CounterID,
StartDate,
sumState(Sign) AS Visits,
uniqState(UserID) AS Users
FROM test.visits
GROUP BY CounterID, StartDate; --向 test.visits 表中插入数据,数据会同时插入到表和视图中,并且视图 test.basic 会将里面的数据聚合。 INSERT INTO test.visits ... -- 获取聚合数据,需要在test.basic视图上执行类似SELECT ... GROUP BY ...这样的查询 SELECT
StartDate,
sumMerge(Visits) AS Visits,
uniqMerge(Users) AS Users
FROM test.basic
GROUP BY StartDate
ORDER BY StartDate;

数据处理逻辑

最后总结一下AggregatingMergeTree的处理逻辑。

  1. 用ORBER BY排序键作为聚合数据的条件Key。
  2. 使用AggregateFunction字段类型定义聚合函数的类型以及聚合的字段。
  3. 只有在合并分区的时候才会触发聚合计算的逻辑。
  4. 以数据分区为单位来聚合数据。当分区合并时,同一数据分区内聚合Key相同的数据会被合并计算,而不同分区之间的数据则不会被计算。
  5. 在进行数据计算时,因为分区内的数据已经基于ORBER BY排序,所以能够找到那些相邻且拥有相同聚合Key的数据。
  6. 在聚合数据时,同一分区内,相同聚合Key的多行数据会合并成一行。对于那些非主键、非AggregateFunction类型字段,则会使用第一行数据的取值。
  7. AggregateFunction类型的字段使用二进制存储,在写入数据时,需要调用*State函数;而在查询数据时,则需要调用相应的*Merge函数。其中,*表示定义时使用的聚合函数。
  8. AggregatingMergeTree通常作为物化视图的表引擎,与普通MergeTree搭配使用。

ClickHouse相关资料分享

ClickHouse经典中文文档分享

参考文章:ClickHouse(03)ClickHouse怎么安装和部署

ClickHouse(12)ClickHouse合并树MergeTree家族表引擎之AggregatingMergeTree详细解析的更多相关文章

  1. ClickHouse(10)ClickHouse合并树MergeTree家族表引擎之ReplacingMergeTree详细解析

    目录 建表语法 数据处理策略 资料分享 参考文章 MergeTree拥有主键,但是它的主键却没有唯一键的约束.这意味着即便多行数据的主键相同,它们还是能够被正常写入.在某些使用场合,用户并不希望数据表 ...

  2. UniqueMergeTree:支持实时更新删除的 ClickHouse 表引擎

    UniqueMergeTree 开发的业务背景 首先,我们看一下哪些场景需要用到实时更新. 我们总结了三类场景: 第一类是业务需要对它的交易类数据进行实时分析,需要把数据流同步到 ClickHouse ...

  3. ClickHouse入门:表引擎-HDFS

    前言插件及服务器版本服务器:ubuntu 16.04Hadoop:2.6ClickHouse:20.9.3.45 文章目录 简介 引擎配置 HDFS表引擎的两种使用形式 引用 简介 ClickHous ...

  4. ClickHouse(02)ClickHouse架构设计介绍概述与ClickHouse数据分片设计

    ClickHouse核心架构设计是怎么样的?ClickHouse核心架构模块分为两个部分:ClickHouse执行过程架构和ClickHouse数据存储架构,下面分别详细介绍. ClickHouse执 ...

  5. EXCEL 如何将多个工作表或工作簿合并到一个工作表

    在使用Excel 时,我们经常需要将多个工作表或工作簿合并到一个工作表中,这样我们就能快速地对数据进行分析和统计.对于一般用户而言,除了复制每个工作表后再粘贴,没有其他什么方法了.如果只是合并少数几个 ...

  6. 多个DataTable的合并成一个新表

    多个DataTable的合并成一个新表 参考:https://www.cnblogs.com/JuneZhang/archive/2011/12/11/2284243.html

  7. ClickHouse(05)ClickHouse数据类型详解

    ClickHouse属于分析型数据库,ClickHouse提供了许多数据类型,它们可以划分为基础类型.复合类型和特殊类型.其中基础类型使ClickHouse具备了描述数据的基本能力,而另外两种类型则使 ...

  8. ClickHouse(07)ClickHouse数据库引擎解析

    目录 Atomic 建表语句 特性 Table UUID RENAME TABLES DROP/DETACH TABLES EXCHANGE TABLES ReplicatedMergeTree in ...

  9. Codeforces 455C Civilization:树的直径 + 并查集【合并树后直径最小】

    题目链接:http://codeforces.com/problemset/problem/455/C 题意: 给你一个森林,n个点,m条边. 然后有t个操作.共有两种操作: (1)1 x: 输出节点 ...

  10. PHP如何输出合并单元格的表

    https://mp.weixin.qq.com/s/ChPIKIv9tqmuqGyfc9Zi7Q 合并单元格的表,很多地方可以见到,比如购物车,订单合并等,今天给大家讲解一下,如何操作,虽然我用的l ...

随机推荐

  1. SqlDataAdapter使用小结

    SqlDataAdapter是 DataSet与SQL Server之间的桥接器,用于相互之间的数据操作. 使用方法 1. 通过查询语句 与 SqlConnection对象实现 string strC ...

  2. Git配置和使用?Git你真的会用么?Git与SVN的主要区别

    1.Git环境配置    在学习Git之前,首先要知道什么是版本控制 1.1 版本控制:版本迭代.新的版本!版本管理器 版本控制是开发过程中用于管理我们的文件.目录或工程内容的修改内容,查看修改历史记 ...

  3. C语言嵌套for循环实现冒泡排序

    使用嵌套for循环实现冒泡排序的一个函数. #include<stdio.h> /** * 介绍: * 使用嵌套for循环实现冒泡排序,由小到大(上小下大). * 参数: * sum[]: ...

  4. Vue3笔记(二)了解组合式API的应用与方法

    一.组合式API(Composition API)的介绍 官方文档: https://v3.cn.vuejs.org/guide/composition-api-introduction.html 组 ...

  5. 在 Solidity 中 ++i 为什么比 i++ 更省 Gas?

    前言 作为一个初学者,"在 Solidity 中 ++i 为什么比 i++ 更省 Gas?" 这个问题始终在每个寂静的深夜困扰着我.也曾在网上搜索过相关问题,但没有得到根本性的解答 ...

  6. i春秋象棋

    这是一道非常有意思的一道题,打开后就是一个pve的象棋游戏,我觉得下赢了就应该会出现flag,可惜多次尝试后失败了(果真有点厉害,我一时兴起就玩了好几把,有空试试拿更厉害的电脑跟他对下,如果赢了会怎么 ...

  7. 在CentOS编译Git源码

    Git 是一个免费的开源分布式版本控制系统,旨在处理从小到小到的所有内容 具有速度和效率的超大型项目. Git易于学习,占用空间很小,性能快如闪电. 它超越了Subversion,CVS,Perfor ...

  8. day 26 form表单标签 & CSS样式表-选择器 & 样式:背景、字体、定位等

    html常用标签 嵌套页面 <!-- 嵌套页面 --> <div> <!-- target属性值可以通过指定的iframe的name属性值, 实现超链接页面,在嵌套页面展 ...

  9. 【Java Web】项目通用返回模块ServerResponse:枚举code状态码、泛型返回值、序列化注解限制数据

    一.枚举类编写ResponseCode package com.boulderaitech.common; /** * 编写枚举类的步骤 * (1)编写所需的变量 * (2)编写枚举类构造方法 * ( ...

  10. 单点登录系统使用Spring Security的权限功能

    背景 在配置中心增加权限功能 目前配置中心已经包含了单点登录功能,可以通过统一页面进行登录,登录完会将用户写入用户表 RBAC的用户.角色.权限表CRUD.授权等都已经完成 希望不用用户再次登录,就可 ...