首页 > 其他分享 >ClickHouse(12)ClickHouse合并树MergeTree家族表引擎之AggregatingMergeTree详细解析

ClickHouse(12)ClickHouse合并树MergeTree家族表引擎之AggregatingMergeTree详细解析

时间:2023-02-06 20:11:23浏览次数:72  
标签:StartDate 12 聚合 AggregatingMergeTree 数据 MergeTree ClickHouse

目录
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怎么安装和部署

标签:StartDate,12,聚合,AggregatingMergeTree,数据,MergeTree,ClickHouse
From: https://www.cnblogs.com/the-pig-of-zf/p/17096571.html

相关文章

  • clickhouse http 导入数据
    curl --data-binary@localpath'http://host:port?database=databasename&date_time_input_format=best_effort&query=INSERT%20INTO%20tablename%20%20FORMAT%20CSV'-......
  • Spring12 - 注解管理bean
    Annotation从Java5开始,Java增加了对注解(Annotation)的支持,它是代码中的一种特殊标记,可以在编译、类加载和运行时被读取,执行相应的处理。开发人员可以通过注解在不改变......
  • 代码随想录算法训练营第十八天|LeetCode 513.找树左下角的值、112. 路径总和 、113.路
    513.找树左下角的值文章:代码随想录(programmercarl.com)视频:怎么找二叉树的左下角?递归中又带回溯了,怎么办?|LeetCode:513.找二叉树左下角的值_哔哩哔哩_bilibili思路(......
  • 返回12个月和每月数据
    @OverridepublicListlineChart(Integercyear){TerTerminalReqVovo=newTerTerminalReqVo();List<TerTerminalReqVo>list=terTerminalMapper.queryCount(......
  • 算法导论-上课笔记12:所有结点对的最短路径问题
    文章目录​​0前言​​​​1最短路径和矩阵乘法​​​​2Floyd-Warshall算法​​​​3用于稀疏图的Johnson算法​​0前言如何找到一个图中所有结点之间的最短路径?给定......
  • 解读ping -n 4 127.1 >nul 2>nul
    命令解读ping是Windows、Unix和Linux系统下的一个命令。ping也属于一个通信协议,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定......
  • 洛谷 P2412 查单词
    这是一个非常有意思的题……这一个题放在线段树里面显得非常清奇。很多题解并没有用线段树,或者是用的线段树方法很难。因此,这里为初学者献上一份较为简单容易看懂的代码。......
  • SQL1224 is returned during the execution of an SQL procedure
    SQL1224isreturnedduringtheexecutionofanSQLprocedurehttps://www.ibm.com/support/pages/sql1224-returned-during-execution-sql-procedureQue......
  • Python(12)--元组
    一、元组的基本介绍元组(tuple):这种数据类型结构与列表相同,但它与列表也有很大的差异,它的元素值与元素个数不可更改。列表的定义是将元素放入[]中,元组的定义是将元素放入()中......
  • AT_arc123_b [ARC123B] Increasing Triples 翻译
    题目传送门题目描述$N$项组成的整数列$A=\(A_1\\ldots,\A_N),,B=\(B_1\\ldots,\B_N),,C=\(C_1,\\ldots,\C_N)$。你可以对数列进......