ClickHouse(十六):Clickhouse MergeTree系列表引擎 - CollapsingMergeTree

news2024/11/24 19:38:09

 进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容!

🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客

📌订阅:拥抱独家专题,你的订阅将点燃我的创作热情!

👍点赞:赞同优秀创作,你的点赞是对我创作最大的认可!

⭐️ 收藏:收藏原创博文,让我们一起打造IT界的荣耀与辉煌!

✏️评论:留下心声墨迹,你的评论将是我努力改进的方向!


目录

1. CollapsingMergeTree建表语法

2. 存在的问题

3. 数据折叠保留规则

4. 示例


CollapsingMergeTree就是一种通过以增代删的思路,支持行级数据修改和删除的表引擎。它通过定义一个sign标记位字段,记录数据行的状态。如果sign标记为1,则表示这是一行有效的数据;如果sign标记为-1,则表示这行数据需要被删除。当CollapsingMergeTree分区合并时,同一数据分区内,sign标记为1和-1的一组数据会被抵消删除。

每次需要新增数据时,写入一行sign标记为1的数据;需要删除数据时,则写入一行sign标记为-1的数据。此外,只有相同分区内的数据才有可能被折叠。

1. CollapsingMergeTree建表语法

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]

(

    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],

    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],

...

sign Int8

) ENGINE = CollapsingMergeTree(sign)

[PARTITION BY expr]

[ORDER BY expr]

[SAMPLE BY expr]

[SETTINGS name=value, ...]

2. 存在的问题

CollapsingMergeTree对于写入数据的顺序有着严格要求,否则导致无法正常折叠。

3. 数据折叠保留规则

在同一个分区内order by 字段相同的数据存在多条,且sign值不同,数据保留规则如下:

  1. 如果sign=1和sign=-1的行数相同并且最后一行数据sign=1,则保留第一行sign=-1的行和最后一行sign=1的行。
  2. 如果sign=1的行比sign=-1的行多,则保留最后一条sign=1的行。
  3. 如果sign=-1的行比sign=1的行多,则保留第一条sign=-1的行。
  4. 其他情况,不保留数据。

4. 示例

  • 按照顺序写入需要更新或删除的数据:
#创建表 t_collapsing_mt ,使用CollapsingMergeTree

node1 :) create table t_collapsing_mt(

:-] id UInt8,

:-] name String,

:-] loc String,

:-] login_times UInt8,

:-] total_dur UInt8,

:-] sign Int8

:-] )engine = CollapsingMergeTree(sign)

:-] order by (id,total_dur)

:-] primary key id

:-] partition by loc

:-] ;



#向表   t_collapsing_mt 中插入以下数据:

node1 :) insert into t_collapsing_mt values(1,'张三','北京',1,30,1),(2,'李四','上海',1,40,1)



#查看表 t_collapsing_mt中的数据

node1 :) select * from t_collapsing_mt;

┌─id─┬─name─┬─loc──┬─login_times─┬─total_dur─┬─sign─┐

│  2  │ 李四   │ 上海   │           1    │        40   │    1  │

└────┴─────┴──────┴───────────┴──────────┴─────┘

┌─id─┬─name─┬─loc──┬─login_times─┬─total_dur─┬─sign─┐

│  1   │ 张三  │ 北京   │           1   │        30   │    1   │

└────┴─────┴──────┴───────────┴─────────┴──────┘



#向表 t_collapsing_mt中继续插入一条数据,删除“张三”数据

node1 :) insert into t_collapsing_mt values(1,'张三','北京',1,30,-1);



#查询表 t_collapsing_mt 中的数据

node1 :) select * from t_collapsing_mt;

┌─id─┬─name─┬─loc──┬─login_times─┬─total_dur─┬─sign─┐

│  1   │ 张三  │ 北京   │           1   │        30    │    1  │

└────┴─────┴──────┴───────────┴──────────┴─────┘

┌─id─┬─name─┬─loc──┬─login_times─┬─total_dur─┬─sign─┐

│  2 │ 李四   │ 上海   │           1     │        40   │    1  │

└───┴─────┴──────┴────────────┴──────────┴─────┘

┌─id─┬─name─┬─loc──┬─login_times─┬─total_dur─┬─sign─┐

│  1  │ 张三   │ 北京  │           1     │        30   │    -1 │

└────┴─────┴──────┴───────────┴─────────┴─────┘



#手动触发 optimize 合并相同分区数据

node1 :) optimize table t_collapsing_mt;



#查询表 t_collapsing_mt 中的数据

node1 :) select * from t_collapsing_mt;

┌─id─┬─name─┬─loc──┬─login_times─┬─total_dur─┬─sign─┐

│  2 │ 李四   │ 上海   │           1     │        40   │    1  │

└───┴─────┴──────┴────────────┴──────────┴─────┘





#插入以下两条数据,来更新 “李四”数据

node1 :) insert into t_collapsing_mt values(2,'李四','上海',1,40,-1),(2,'李四','上海',2,100,1);



#查询表 t_collapsing_mt 中的数据

node1 :) select * from t_collapsing_mt;

┌─id─┬─name─┬─loc──┬─login_times─┬─total_dur─┬─sign─┐

│  2  │ 李四  │ 上海  │           1    │        40   │    1 │

└────┴──────┴──────┴─────────────┴───────────┴──────┘

┌─id─┬─name─┬─loc──┬─login_times─┬─total_dur─┬─sign─┐

│  2  │  李四 │ 上海  │           1   │        40   │   -1  │

│  2  │ 李四  │ 上海  │           2   │       100   │    1  │

└────┴──────┴──────┴─────────────┴───────────┴──────┘



#手动执行 optimize 触发相同分区合并

node1 :) optimize table t_collapsing_mt;



#查看表 t_collapsing_mt中的数据

node1 :) select * from t_collapsing_mt;

┌─id─┬─name─┬─loc──┬─login_times─┬─total_dur─┬─sign─┐

│  2  │ 李四  │ 上海  │           2    │       100  │    1  │

└────┴──────┴──────┴─────────────┴───────────┴──────┘



注意:以上功能使用 collapsingMergeTree实现了分区合并。
  • 乱序写入需要更新或删除的数据:
#删除表 t_collapsing_mt ,重新创建表 t_collapsing_mt

这里建表语句与之前一样



#向表 t_collapsing_mt 中插入以下数据:

node1 :) insert into t_collapsing_mt values(1,'张三','北京',1,30,-1),(1,'张三','北京',1,30,1),(2,'李四','上海',1,40,1)



#查询表 t_collapsing_mt中的数据

node1 :) select * from t_collapsing_mt;

┌─id─┬─name─┬─loc──┬─login_times─┬─total_dur─┬─sign─┐

│  2  │ 李四  │ 上海  │           1   │        40   │    1  │

└────┴──────┴──────┴─────────────┴───────────┴──────┘

┌─id─┬─name─┬─loc──┬─login_times─┬─total_dur─┬─sign─┐

│  1  │ 张三  │ 北京  │           1   │        30   │   -1  │

│  1  │ 张三  │ 北京  │           1   │        30   │    1  │

└────┴──────┴──────┴─────────────┴───────────┴──────┘



#手动执行 optimize 命令,合并相同分区数据

node1 :) optimize table t_collapsing_mt;



#查询表 t_collapsing_mt表中的数据,数据没有变化

node1 :) select * from t_collapsing_mt;

┌─id─┬─name─┬─loc──┬─login_times─┬─total_dur─┬─sign─┐

│  2  │ 李四  │ 上海  │           1   │        40   │    1  │

└────┴──────┴──────┴─────────────┴───────────┴──────┘

┌─id─┬─name─┬─loc──┬─login_times─┬─total_dur─┬─sign─┐

│  1  │ 张三  │ 北京  │           1   │        30   │   -1  │

│  1  │ 张三  │ 北京  │           1   │        30   │    1  │

└────┴──────┴──────┴─────────────┴───────────┴──────┘



注意:当数据插入到表中的顺序标记如果不是1,-1这种顺序时,合并相同分区内的数据不能达到修改和更新效果。

如果数据的写入程序是单线程执行的,则能够较好地控制写入顺序;如果需要处理的数据量很大,数据的写入程序通常是多线程执行的,那么此时就不能保障数据的写入顺序了。在这种情况下,CollapsingMergeTree的工作机制就会出现问题。但是可以通过VersionedCollapsingMergeTree的表引擎得到解决。


👨‍💻如需博文中的资料请私信博主。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/857076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

风丘科技将亮相 EVM ASIA 2023

风丘科技将首次亮相 EVM ASIA 2023 WINDHILL will debut EVM ASIA 2023 ——可持续移动的未来 —The Future of SUSTAINABLE Mobility EVM ASIA 2023是亚太地区电气化的国际性展会,专注于新能源汽车、充电技术及汽车零件制造等。展会致力于促进包括充电站、交通…

SpringBoot(十)SpringBoot自定义starter

一个月的时间,转眼已经到了我的SpringBoot系列的第十篇文章。还记得我的第二篇文章SpringBoot(二)starter介绍_springboot的starter_heart荼毒的博客-CSDN博客 曾经介绍过starter。starter除了官方提供的以外,我们也可以自定义。本…

【前端 | CSS】align-items与align-content的区别

align-items 描述 CSS align-items 属性将所有直接子节点上的 align-self 值设置为一个组。align-self 属性设置项目在其包含块中在交叉轴方向上的对齐方式 align-items是针对每一个子项起作用,它的基本单位是每一个子项,在所有情况下都有效果&…

面试热题(路径总和II)

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 在这里给大家提供两种方法进行思考,第一种方法是递归,第二种方式使用回溯的方式进行爆…

携程验证码

今日话题:凑字数水文章。大表哥们感兴趣可以看看。 携程验证类型总共有3种。无感,滑块,点选。 process_type:None为无感 验证接口:https://ic.ctrip.com/captcha/v4/risk_inspect process_type:JIGSAW为…

opencv带GStreamer之Windows编译

目录 1、下载GStreamer和安装2. GSTReamer CMake配置3. 验证是否配置成功 1、下载GStreamer和安装 下载地址如下: gstreamer-1.0-msvc-x86_64-1.18.2.msi gstreamer-1.0-devel-msvc-x86_64-1.18.2.msi 安装目录无要求,主要是安装完设置环境变量 xxx\1…

无涯教程-Perl - getservbyport函数

描述 此功能转换协议PROTO的服务编号PORT,在标量context中返回服务名称,并在列表context中返回名称和相关信息- ($name,$aliases,$port_number,$protocol_name) 该调用基于/etc/services文件返回这些值。 语法 以下是此函数的简单语法- getservbyport PORT, PROTO返回值 …

科学家揭示:爱的能量是光——能够治愈一切!

当你和你的恋人食指相触时,指尖发出的辉光会产生闪电般绚烂的连结; 当你对着亲密的另一半说“我爱你”时,一团物质能量随即从你的胸口释出,飞向另一个人——这听起来像魔幻电影般的场景,却是实实在在的物理现象。 1、人…

uniapp input输入框placeholder文本右对齐

input输入框placeholder文本右对齐 给input标签加上placeholder-class,这个是给placeholder设置样式,右对齐这就是text-align:right;字体颜色之类依次编辑即可。

python——案例13:显示现在的时间

案例13:显示现在的时间import timefor i in range(1):print(time.strftime(%Y-%m-%d %H:%M:%S,time.localtime(time.time())))

GLSL用于图像处理

Pipeline 硬件处理顶点和片段的Pipeline 软件的输入 顶点着色器 顶点的glsl 输入–特殊全局变量 变量 类型 指定函数 描述 gl_ Vertex vec4 glVertex 顶点的全局空间坐标 gl_Color vec4 glColor 主颜色值 gl_SecondaryColor vec4 glSecondaryColor 辅助颜色值 gl_Normal …

布谷鸟配音:智能文字转语音配音软件

这是一款主打文字转语音功能的智能配音软件,它提供了数百种不同风格、具备真人发声效果的配音音效,包含沉稳的男声、温柔的女声、稚嫩的童声,还支持方言和外语配音,可以应用于多种场景,例如在线教育、广告宣传、电子书…

贡献超 10 万代码的新晋 committer,持续参与 Apache IoTDB 社区的“秘籍”是?

资深贡献者成为 Committer! 2023 年 5 月 5 日,经 Apache IoTDB 社区投票,周沛辰成为 Apache IoTDB Committer。但其实这位新 committer 已经是 GitHub 代码贡献量突破 10 万,排名靠前的“资深贡献者”了。这位 Apache IoTDB 的“…

百度、NVIDIA、Intel……各大厂商集结,共话文心与飞桨共享生态下的大模型训推部署创新实践计划...

由深度学习技术及应用国家工程研究中心主办、百度飞桨和文心大模型承办的WAVE SUMMIT 2023峰会重磅来袭!本届峰会聚焦AI技术、产业生态、未来趋势等主要方向,产、学、研、用各界大咖将围绕深度学习及大模型技术的发展与未来,带来行业前瞻洞察…

免费logo生成软件,总有一个适合你

随着互联网的发展,越来越多的企业开始注重品牌形象的塑造,而作为品牌形象的重要组成部分之一的logo也越来越受到关注。一个好的logo不仅可以传达企业的理念,还可以提升企业的知名度和美誉度。那么,在生成logo的过程中需要注意哪些…

Vue中使用qrcode说明

1.安装 npm i qrcode1.5.3 2.导入 import QRCode from qrcode 3.转换 说明:拿到服务器传来的字符串,转换成base64,然后通过img标签展示。 // 字符串转成二维码 let result await this.$API.reqPayInfo(this.orderId); 总结:

ChatGPT将会成为强者的外挂?—— 提高学习能力

目录 前言 一、提高学习力 🧑‍💻 1. 快速找到需要的知识 2. 组合自己的知识体系 3. 内化知识技能 二、提问能力❗ 三、思维、创新能力 🌟 1. 批判性思维 1.1 八大基本结构进行批判性提问 1.2 苏格拉底的提问分类方法 2. 结构化思…

Kubeflow Pipelines介绍与实例

1.背景 ML code仅是Machine Learning systems中的一小部分,像数据收集、特征抽取、配置管理、资源管理、模型部署、模型监控等同样十分的重要。一个典型的机器学习系统由这么多组件或子系统构成时,那么这么多子系统应该如何高效的配合起来? …

客户案例 | 永续发展,低代码助力“双碳”战略历史使命

关键发现 客户痛点:应对企业数字化转型,新技术能否提升绩效的不确定性,投资带来的风险性,以及企业组织架构的适应性等难点问题。作为业务驱动型企业,欠缺快速构建数字化产品方案的能力。 解决方案:利用西门…

【T3】固定资产模块点击资产增加时 提示“由于互斥功能正在运行或者相关设置步骤未完成,此功能暂时不可用”。

【问题描述】 在用友通T3软件中, 固定资产模块点击资产增加时 提示“由于互斥功能正在运行或者相关设置步骤未完成,此功能暂时不可用”。 【原因分析】 (1)可能之前出现过非正常关闭软件的行为导致功能被锁定 (2&…