| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> ClickHouse MergeTree家族特殊表引擎 -> 正文阅读 |
|
[大数据]ClickHouse MergeTree家族特殊表引擎 |
在前面的文章中,我们详细介绍了ClickHouse MergeTree表引擎的使用场景、原理、数据存储结构、建表语句以及索引优化。详见《ClickHouse MergeTree表引擎和建表语句》、《ClickHouse MergeTree二级索引/跳数索引》。 MergeTree引擎表是使用最为广泛的表,除了MergeTree引擎表以外,MergeTree家族还有一些特殊的表引擎,在一些特殊场景中能够表现出更好地性能。例如,统计电商平台每天的销售额等。 1. AggregatingMergeTree作为MergeTree家族中的一员,AggregatingMergeTree 表引擎也继承自MergeTree引擎。从名字也可以看出,AggregatingMergeTree 主要是一种聚合表引擎,可以把一个数据片段内的原始数据根据主键(确切地说是排序键)按照给定的聚合函数进行增量聚合。聚合函数主要有两种类型: (1)AggregateFunction AggregateFunction类型聚合函数具有实现定义的中间状态,该状态可以序列化为AggregateFunction(…)数据类型,并通常通过物化视图存储在表中,类似于Tensorflow1中的静态图和Spark中的懒加载算子,只定义计算逻辑,但不执行。。 生成聚合函数状态的方法是在建表的时候定义 AggregateFunction 类型字段,插入数据的时候使用带有 State 后缀的函数写入,- State 函数返回的是状态,而不是最终值。换句话说,它们返回AggregateFunction类型的值。读取数据的时候使用带有 Merge 后缀的函数查询就可以了。例如:
查询数据时,需使用 GROUP BY 子句并且要使用与插入时相同的聚合函数,带有Merge后缀的聚合函数接受一组状态(State),将它们组合在一起,并返回完整数据聚合的结果。例如,以下两个查询返回相同的结果:
(2)SimpleAggregateFunction AggregateFunction 有一个有一个很大的缺点,需要存储数据的全部状态,对于sum、max等聚合操作完全可以对已有数据进行预计算,写入新的数据时,只需要把新的聚合结果和预聚合结果进行聚合更新就可以了,AggregateFunction 似乎完全体现不出 Aggregate 的优势。因此,对于这种可以预聚合的操作,clickhouse又提供了另一种数据类型——SimpleAggregateFunction。SimpleAggregateFunction的性能高于AggregateFunction,支持的聚合函数如下:
建表语句如下:
※注意: 生成SimpleAggregateFunction聚合函数值的常用方法是调用带有 SimpleState后缀的聚合函数,如 sumSimpleState。 (3)物化视图建表 可以发现上面这种形式是很麻烦的,一般情况下很少使用,更常用的方法是通过物化视图的形式创建 AggregatingMergeTree 表(关于物化视图的概念,我们后面介绍,可以参考其他数据库view理解,相当于一张虚拟表,但是与普通视图完全不同)。先建立一个 MergeTree 表,然后建立AggregatingMergeTree引擎的物化视图跟踪基础表。这样即保存了明细数据,不破坏原有数据结构,又可以跟踪聚合结果。例如:
在新增数据时,把明细数据写入基础表 test.visits 中,在查询聚合结果时,直接查物化视图 test.basic 即可:
2. SummingMergeTreeSummingMergeTree 同样继承自 MergeTree,可以认为是 AggregatingMergeTree 的一种特殊方式,同样基于主键(或者更准确地说,使用相同的排序键)聚合,在使用时也多是基于一张明细表建立物化视图,这样不会丢失原有数据,如果发现聚合键不合适,还可以修改。另外,需要注意:
建表语句如下:
SummingMergeTree中的 [columns] 表示需要聚合的列,如果没有指定,表示对主键之外的所有数值型字段进行聚合。例如:
在前面介绍MergeTree表引擎的时候,我们有提到,一般情况下我们不需要单独指定主键字段,ORDER BY 字段就是主键字段。但是在 AggregatingMergeTree 和 SummingMergeTree 表中可以指定 PRIMARY KEY 和 ORDER BY 字段不同,因为如果不单独定义主键,而聚合键字段又比较多,就会导致主键过多,降低写效率,而且可能需要增加新的聚合维度,泛化能力降低。此时就可以只保留少量的列在主键当中用于提升扫描效率,将其余的维度列添加到排序键元组中。 例如:假设有一张表有col1,col2,col3,col4四个字段,我们需要按照col1,col2进行聚合,并经常需要通过col1字段过滤,则可以按照如下定义:
3. ReplacingMergeTreeReplacingMergeTree 引擎表会在后台合并时对 ORDER BY 字段相同的行进行去重。建表语句如下:
※ 注意:
4. CollapsingMergeTreeCollapsingMergeTree 同样继承自 MergeTree 表引擎,主要用来删除数据。我们知道MergeTree 表改、删的效率是比较低的,CollapsingMergeTree 引擎采用了 “以增代删” 的思想。建表语句如下:
CollapsingMergeTree 引擎表有一个 sign 参数,sign 是一个类型为 Int8 的字段名,可以取值 1 和 -1。1 表示正常插入的数据,-1表示删除上一条 sign = 1的记录,所以 CollapsingMergeTree 删除数据是通过插入一条新记录实现,这也是 Collapsing (折叠)的含义所在。对于同一个分区内(不能跨分区)ORDER BY 字段相同的记录,如果两条记录的sign先后分别是1和-1,则在Merge的时候,两条记录会同时被删除。注意删除(折叠)规则如下:
※注意: CollapsingMergeTree 也是后台操作,不是实时的,只有Merge的时候才会折叠(删除)数据,而且如果有多个任务在操作同一个表,可能会导致 sign 错乱,造成不可预知的结果,使用时要慎重考虑(建议使用下一节的VersionedCollapsingMergeTree表)。但是,CollapsingMergeTree 表无疑变相实现了delete和update操作,而且以空间换时间,提高了效率。当然,也可以通过 GROUP BY + HAVING sum(Sign) > 0 的形式查询:
也可以为FROM子句使用FINAL修饰符,但是这种方法的效率比较低,尤其不要用在大表上面:
或者当插入 sign = -1 的记录时,把关注的数值列同样取反插入,这样当查询计算sum(数值列)的时候,也可以不关注sign。 5. VersionedCollapsingMergeTree根绝第4节CollapsingMergeTree的介绍可知,CollapsingMergeTree对数据的插入顺序是有严格要求的,不合理的插入顺序可能会导致难以预测的结果。针对这种情况,clickhouse又推出了VersionedCollapsingMergeTree表引擎。VersionedCollapsingMergeTree 引擎表建表语句如下:
VersionedCollapsingMergeTree 引擎参数 sign 和 CollapsingMergeTree 一样,Int8类型,1 表示“state”(插入有效数据),-1 表示“cancel”(删除上一次插入的数据);参数 version 是版本控制字段,UInt* 类型。 VersionedCollapsingMergeTree 通过 version 列来控制乱序数据的折叠,对数据的写入顺序没有要求。但是 version 不同的记录不会相互折叠(删除),即使新的 version 更大,因为 VersionedCollapsingMergeTree 的实现方式是把 version 字段隐式加到 ORDER BY 最后。 同样,VersionedCollapsingMergeTree 也是在合并的时候才会进行折叠,因此在使用时最好通过聚合查询,例如统计数据量使用 sum(Sign),而不是 count(),求和使用 sum(Sign * x) + HAVING sum(Sign) > 0 代替 sum(x)。 总之,对于需要频繁删除、修改的数据 CollapsingMergeTree、VersionedCollapsingMergeTree 是一种合理、高效的表引擎,但是务必要注意数据写入顺序、数量的管理。 6. GraphiteMergeTreeGraphiteMergeTree 引擎表是为存储 Graphite 后台数据而设计的,可以用来优化rollup,使用较少。Graphite 是一个企业级的监控工具,可以在廉价的硬件上良好运行。 7. Data ReplicationMergeTree 和上述 6 中表引擎都有对应的 Replication 表引擎,除了功能和各自对应表引擎一样外,还实现了副本功能,换句话说就是数据HA。表引擎名称分别是 Replicated 加对应表引擎名称,例如:ReplicatedMergeTree、ReplicatedReplacingMergeTree 等。因为副本表往往是和分片一起创建(通过集群),因此,关于副本和分片的配置、使用我们将在下一篇文章中一起详细介绍。 ※ 注意: 和HDFS不同,ClickHouse MergeTree 家族表的副本机制是表级别的,不是库级别的,但是可以通过集群配置。另外,Replication 表功能是实现数据副本备份,不是横向扩展能力(横向扩展是通过分片来实现的),两个节点可以组成两副本表,存储数据一样,但是存储能力并没有增加。 参考文章[1] https://blog.csdn.net/u012551524/article/details/112118734 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 4:33:12- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |