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

简介: `SummingMergeTree`是`MergeTree`引擎的变种,它合并相同主键的行并计算数值列的总和,从而节省存储空间和加速查询。通常与`MergeTree`配合使用,存储聚合数据以避免数据丢失。创建`SummingMergeTree`表时,可选参数`columns`指定要汇总的数值列。未指定时,默认汇总所有非主键数值列。注意,聚合可能不完整,查询时需用`SUM`和`GROUP BY`。文章还介绍了建表语法、数据处理规则以及对嵌套数据结构和`AggregateFunction`列的处理。查阅更多ClickHouse相关内容可访问相关链接。

SummingMergeTree引擎继承自MergeTree。区别在于,当合并SummingMergeTree表的数据片段时,ClickHouse会把所有具有相同主键的行合并为一行,该行包含了被合并的行中具有数值数据类型的列的汇总值。如果主键的组合方式使得单个键值对应于大量的行,则可以显著的减少存储空间并加快数据查询的速度。

一般SummingMergeTree和MergeTree一起使用。例如,在准备做报告的时候,将完整的数据存储在MergeTree表中,并且使用SummingMergeTree来存储聚合数据。这种方法可以避免因为使用不正确的主键组合方式而丢失有价值的数据。

建表语法

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = SummingMergeTree([columns])
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]

创建SummingMergeTree表的参数中,与MergeTree不同的是[columns]。columns包含了将要被汇总的列的列名的元组。属于可选参数。所选的列必须是数值类型,并且不可位于主键中。

如果没有指定columns,ClickHouse会把所有不在主键中的数值类型的列都进行汇总。

其他的参数与MergeTree表是一致。

MergeTree表引擎的解析可以参考ClickHouse(09)ClickHouse合并树MergeTree家族表引擎之MergeTree详细解析

-- 建表
CREATE TABLE summtt
(
    key UInt32,
    value UInt32
)
ENGINE = SummingMergeTree()
ORDER BY key;

-- 插入数据
INSERT INTO summtt Values(1,1),(1,2),(2,1);

-- 查询数据
-- ClickHouse可能不会完整的汇总所有行,因此在查询中使用了聚合函数sum和GROUP BY子句。
-- ClickHouse定期合并插入的数据片段,并在这个时候对所有具有相同主键的行中的列进行汇总,将这些行替换为包含汇总数据的一行记录。
SELECT key, sum(value) FROM summtt GROUP BY key;

-- 查询结果
┌─key─┬─sum(value)─┐
│   21 │
│   13 │
└─────┴────────────┘

数据处理

当数据被插入到表中时,他们将被原样保存。ClickHouse定期合并插入的数据片段,并在这个时候对所有具有相同主键的行中的列进行汇总,将这些行替换为包含汇总数据的一行记录。

ClickHouse会按片段合并数据,以至于不同的数据片段中会包含具有相同主键的行,即单个汇总片段将会是不完整的。因此,聚合函数sum()和GROUP BY子句应该在(SELECT)查询语句中被使用,如上面的例子。

汇总的通用规则

  • 列中数值类型的值会被汇总,进行sum操作。这些列的集合在参数columns中被定义。
  • 如果用于汇总的所有列中的值均为0,则该行会被删除。
  • 如果列不在主键中且无法被汇总,则会在现有的值中任选一个。
  • 主键所在的列中的值不会被汇总。

AggregateFunction 列中的汇总

对于AggregateFunction类型的列,ClickHouse根据对应函数表现为AggregatingMergeTree引擎的聚合。

嵌套结构数据的处理

表中可以具有以特殊方式处理的嵌套数据结构。

如果嵌套表的名称以 Map 结尾,并且包含至少两个符合以下条件的列:

  • 第一列是数值类型(Int,Date,DateTime),称之为key,
  • 其他的列是可计算的(Int,Float32/64),称之为(values...),

然后这个嵌套表会被解释为一个key=>(values...)的映射,当合并它们的行时,两个数据集中的元素会被根据key合并为相应的(values...)的汇总值。如下面的例子。

[(1, 100)] + [(2, 150)] -> [(1, 100), (2, 150)]
[(1, 100)] + [(1, 150)] -> [(1, 250)]
[(1, 100)] + [(1, 150), (2, 150)] -> [(1, 250), (2, 150)]
[(1, 100), (2, 150)] + [(1, -100)] -> [(2, 150)]

请求数据时,使用sumMap(key,value)函数来对Map进行聚合。对于嵌套数据结构,你无需在列的元组中指定列以进行汇总。

资料分享

ClickHouse经典中文文档分享

clickhouse系列文章

相关文章
|
消息中间件 分布式计算 关系型数据库
大数据-140 - ClickHouse 集群 表引擎详解5 - MergeTree CollapsingMergeTree 与其他数据源 HDFS MySQL
大数据-140 - ClickHouse 集群 表引擎详解5 - MergeTree CollapsingMergeTree 与其他数据源 HDFS MySQL
348 0
|
SQL 消息中间件 分布式计算
大数据-141 - ClickHouse 集群 副本和分片 Zk 的配置 Replicated MergeTree原理详解(一)
大数据-141 - ClickHouse 集群 副本和分片 Zk 的配置 Replicated MergeTree原理详解(一)
508 0
|
SQL 大数据
大数据-141 - ClickHouse 集群 副本和分片 Zk 的配置 Replicated MergeTree原理详解(二)
大数据-141 - ClickHouse 集群 副本和分片 Zk 的配置 Replicated MergeTree原理详解(二)
508 0
|
存储 SQL 分布式计算
大数据-139 - ClickHouse 集群 表引擎详解4 - MergeTree 实测案例 ReplacingMergeTree SummingMergeTree
大数据-139 - ClickHouse 集群 表引擎详解4 - MergeTree 实测案例 ReplacingMergeTree SummingMergeTree
348 0
|
存储 算法 NoSQL
大数据-138 - ClickHouse 集群 表引擎详解3 - MergeTree 存储结构 数据标记 分区 索引 标记 压缩协同
大数据-138 - ClickHouse 集群 表引擎详解3 - MergeTree 存储结构 数据标记 分区 索引 标记 压缩协同
425 0
|
存储 消息中间件 分布式计算
大数据-137 - ClickHouse 集群 表引擎详解2 - MergeTree 存储结构 一级索引 跳数索引
大数据-137 - ClickHouse 集群 表引擎详解2 - MergeTree 存储结构 一级索引 跳数索引
267 0
|
JavaScript
js 解析和操作树 —— 获取树的深度、提取并统计树的所有的节点和叶子节点、添加节点、修改节点、删除节点
js 解析和操作树 —— 获取树的深度、提取并统计树的所有的节点和叶子节点、添加节点、修改节点、删除节点
520 0
|
SQL NoSQL 关系型数据库
ClickHouse(24)ClickHouse集成mongodb表引擎详细解析
**MongoDB引擎在ClickHouse中提供只读访问远程数据,用于`SELECT`查询。不支持写入。创建MongoDB表引擎的语法:`CREATE TABLE ... ENGINE = MongoDB(host, db, coll, user, pass)`。例如:**查看[ClickHouse中文文档](https://zhangfeidezhu.com/?p=468)获取更多教程,包括系列文章覆盖的各种表引擎解析。
440 0
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1231 29
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
511 4

推荐镜像

更多