前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ClickHouse(12)ClickHouse合并树MergeTree家族表引擎之AggregatingMergeTree详细解析

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

原创
作者头像
张飞的猪大数据分享
发布2024-03-21 18:33:19
950
发布2024-03-21 18:33:19
举报

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

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

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

  • AggregateFunction
  • SimpleAggregateFunction

AggregatingMergeTree适用于能够按照一定的规则缩减行数的情况。

建表语法

代码语言:sql
复制
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语句导回。

如下面的例子。

代码语言:sql
复制
-- 创建一个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搭配使用。

系列文章

https://cloud.tencent.com/developer/column/96434?from_column=20421&from=20421

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 建表语法
  • 查询和插入数据
  • 数据处理逻辑
  • 系列文章
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档