ClickHouse(12)ClickHouse合并树MergeTree家族表引擎之AggregatingMergeTre ...

打印 上一主题 下一主题

主题 616|帖子 616|积分 1848

目录

AggregatingMergeTree引擎继承自 MergeTree,并改变了数据片段的合并逻辑。ClickHouse会将一个数据片段内所有具有相同主键(准确的说是排序键)的行替换成一行,这一行会存储一系列聚合函数的状态。
可以使用AggregatingMergeTree表来做增量数据的聚合统计,包括物化视图的数据聚合。
引擎使用以下类型来处理所有列:

  • AggregateFunction
  • SimpleAggregateFunction
AggregatingMergeTree适用于能够按照一定的规则缩减行数的情况。
建表语法
  1. CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
  2. (
  3.     name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
  4.     name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
  5.     ...
  6. ) ENGINE = AggregatingMergeTree()
  7. [PARTITION BY expr]
  8. [ORDER BY expr]
  9. [SAMPLE BY expr]
  10. [TTL expr]
  11. [SETTINGS name=value, ...]
复制代码
AggregatingMergeTree表参数与MergeTree表是一致。MergeTree表引擎的解析可以参考ClickHouse(09)ClickHouse合并树MergeTree家族表引擎之MergeTree详细解析
查询和插入数据

要插入数据,需使用带有-State-聚合函数的INSERT或SELECT语句。从AggregatingMergeTree表中查询数据时,需使用GROUP BY子句并且要使用与插入时相同的聚合函数,但后缀要改为-Merge。
对于SELECT查询的结果,AggregateFunction类型的值对ClickHouse的所有输出格式都实现了特定的二进制表示法。在进行数据转储时,例如使用TabSeparated格式进行SELECT查询,那么这些转储数据也能直接用INSERT语句导回。
如下面的例子。
  1. -- 创建一个AggregatingMergeTree物化视图
  2. CREATE MATERIALIZED VIEW test.basic
  3. ENGINE = AggregatingMergeTree() PARTITION BY toYYYYMM(StartDate) ORDER BY (CounterID, StartDate)
  4. AS SELECT
  5.     CounterID,
  6.     StartDate,
  7.     sumState(Sign)    AS Visits,
  8.     uniqState(UserID) AS Users
  9. FROM test.visits
  10. GROUP BY CounterID, StartDate;
  11. --向 test.visits 表中插入数据,数据会同时插入到表和视图中,并且视图 test.basic 会将里面的数据聚合。
  12. INSERT INTO test.visits ...
  13. -- 获取聚合数据,需要在test.basic视图上执行类似SELECT ... GROUP BY ...这样的查询
  14. SELECT
  15.     StartDate,
  16.     sumMerge(Visits) AS Visits,
  17.     uniqMerge(Users) AS Users
  18. FROM test.basic
  19. GROUP BY StartDate
  20. ORDER BY StartDate;
复制代码
数据处理逻辑

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

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

ClickHouse经典中文文档分享
参考文章:ClickHouse(03)ClickHouse怎么安装和部署

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

灌篮少年

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表