ClickHouse(14)ClickHouse合并树MergeTree家族表引擎之VersionedCollapsingMergeTree详细解析
- 建表语法
- 使用场景
- 合并算法
- 使用例子、
- 资料分享
- 参考文章
VersionedCollapsingMergeTree引擎继承自MergeTree并将折叠行的逻辑添加到合并数据部分的算法中。VersionedCollapsingMergeTree用于相同的目的折叠树但使用不同的折叠算法,允许以多个线程的任何顺序插入数据。特别是,Version列有助于正确折叠行,即使它们以错误的顺序插入。相比之下,CollapsingMergeTree只允许严格连续插入。
VersionedCollapsingMergeTree引擎的作用如下:
- 允许快速写入不断变化的对象状态。
- 删除后台中的旧对象状态。 这显著降低了存储体积。
建表语法
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ...) ENGINE = VersionedCollapsingMergeTree(sign, version)[PARTITION BY expr][ORDER BY expr][SAMPLE BY expr][SETTINGS name=value, ...]
针对于VersionedCollapsingMergeTree(sign, version)两个特殊的参数。
(相关资料图)
sign — 指定行类型的列名:1是一个“state”行,-1是一个“cancel”行列数据类型应为Int8.version — 指定对象状态版本的列名。列数据类型应为UInt*.
使用场景
考虑一种情况,您需要为某个对象保存不断变化的数据。对于一个对象有一行,并在发生更改时更新该行是合理的。但是,对于数据库管理系统来说,更新操作非常昂贵且速度很慢,因为它需要重写存储中的数据。如果需要快速写入数据,则不能接受更新,但可以按如下顺序将更改写入对象。使用 Sign 列写入行时。如果Sign=1这意味着该行是一个对象的状态(让我们把它称为“state”行)。如果Sign=-1它指示具有相同属性的对象的状态的取消(让我们称之为“cancel”行)。 还可以使用 Version 列,它应该用单独的数字标识对象的每个状态。
例如,我们要计算用户在某个网站上访问了多少页面以及他们在那里的时间。在某个时间点,我们用用户活动的状态写下面的行:
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐│ 4324182021466249494 │ 5 │ 146 │ 1 │└─────────────────────┴───────────┴──────────┴──────┘
在稍后的某个时候,我们注册用户活动的变化,并用以下两行写入它。
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐│ 4324182021466249494 │ 5 │ 146 │ -1 ││ 4324182021466249494 │ 6 │ 185 │ 1 │└─────────────────────┴───────────┴──────────┴──────┘
第一行取消对象(用户)的先前状态。它应该复制已取消状态的所有字段,除了Sign。
第二行包含当前状态。
因为我们只需要用户活动的最后一个状态,所以需要删除,折叠对象的无效(旧)状态。VersionedCollapsingMergeTree会在在合并数据部分时执行此操作。
最终折叠之后的结果如下。
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 |│ 4324182021466249494 │ 5 │ 146 │ -1 │ 1 |└─────────────────────┴───────────┴──────────┴──────┴─────────┘
对于使用VersionedCollapsingMergeTree有下面三个需要注意的点。
- 写入数据的程序应该记住对象的状态以取消它。该“cancel”字符串应该是“state”与相反的字符串Sign。这增加了存储的初始大小,但允许快速写入数据。
- 列中长时间增长的数组由于写入负载而降低了引擎的效率。数据越简单,效率就越高。
- SELECT结果很大程度上取决于对象变化历史的一致性。准备插入数据时要准确。不一致的数据将导致不可预测的结果,例如会话深度等非负指标的负值。
合并算法
合并算法主要是下面两个。
- 当ClickHouse合并数据部分时,它会删除具有相同主键和版本但Sign值不同的一对行.行的顺序并不重要。
- 当ClickHouse插入数据时,它会按主键对行进行排序。如果Version列不在主键中,ClickHouse将其隐式添加到主键作为最后一个字段并使用它进行排序。
ClickHouse不保证具有相同主键的所有行都将位于相同的结果数据部分中,甚至位于相同的物理服务器上。对于写入数据和随后合并数据部分都是如此。此外,ClickHouse流程SELECT具有多个线程的查询,并且无法预测结果中的行顺序。这意味着,如果有必要从VersionedCollapsingMergeTree表中得到完全“collapsed”的数据,聚合是必需的。
也就是说ClickHouse并不保证查询出来的数据一定是经过合并折叠的。如果要保证一定经过折叠合并,需要查询的时候使用GROUP BY和聚合函数。
要计算数量,使用sum(Sign)而不是count()。要计算的东西的总和,使用sum(Sign * x)而不是sum(x),并添加HAVING sum(Sign) > 0。可以在一定程度上避免数据未折叠导致的数据问题。
如果您需要手动折叠合并,但是,如果没有聚合(例如,要检查是否存在其最新值与某些条件匹配的行),则可以使用FINAL修饰FROM条件这种方法效率低下,不应与大型表一起使用。
使用例子、
示例数据:
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 |│ 4324182021466249494 │ 5 │ 146 │ -1 │ 1 |│ 4324182021466249494 │ 6 │ 185 │ 1 │ 2 |└─────────────────────┴───────────┴──────────┴──────┴─────────┘
创建表:
CREATE TABLE UAct( UserID UInt64, PageViews UInt8, Duration UInt8, Sign Int8, Version UInt8)ENGINE = VersionedCollapsingMergeTree(Sign, Version)ORDER BY UserID
插入数据:
INSERT INTO UAct VALUES (4324182021466249494, 5, 146, 1, 1)INSERT INTO UAct VALUES (4324182021466249494, 5, 146, -1, 1),(4324182021466249494, 6, 185, 1, 2)
我们用两个INSERT查询以创建两个不同的数据部分。如果我们使用单个查询插入数据,ClickHouse将创建一个数据部分,并且永远不会执行任何合并。
获取数据:
SELECT * FROM UAct┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 │└─────────────────────┴───────────┴──────────┴──────┴─────────┘┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐│ 4324182021466249494 │ 5 │ 146 │ -1 │ 1 ││ 4324182021466249494 │ 6 │ 185 │ 1 │ 2 │└─────────────────────┴───────────┴──────────┴──────┴─────────┘
我们在这里看到了什么,折叠的合并部分在哪里?我们使用两个创建了两个数据部分INSERT查询。该SELECT查询是在两个线程中执行的,结果是行的随机顺序。由于数据部分尚未合并,因此未发生折叠合并。 ClickHouse在我们无法预测的未知时间点合并数据部分。
这就是为什么我们需要聚合:
SELECT UserID, sum(PageViews * Sign) AS PageViews, sum(Duration * Sign) AS Duration, VersionFROM UActGROUP BY UserID, VersionHAVING sum(Sign) > 0┌──────────────UserID─┬─PageViews─┬─Duration─┬─Version─┐│ 4324182021466249494 │ 6 │ 185 │ 2 │└─────────────────────┴───────────┴──────────┴─────────┘
如果我们不需要聚合,并希望强制折叠,我们可以使用 FINAL 修饰符 FROM 条款
SELECT * FROM UAct FINAL┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐│ 4324182021466249494 │ 6 │ 185 │ 1 │ 2 │└─────────────────────┴───────────┴──────────┴──────┴─────────┘
资料分享
ClickHouse经典中文文档分享
参考文章
- ClickHouse(01)什么是ClickHouse,ClickHouse适用于什么场景
- ClickHouse(02)ClickHouse架构设计介绍概述与ClickHouse数据分片设计
- ClickHouse(03)ClickHouse怎么安装和部署
- ClickHouse(04)如何搭建ClickHouse集群
- ClickHouse(05)ClickHouse数据类型详解
- ClickHouse(06)ClickHouse建表语句DDL详细解析
- ClickHouse(07)ClickHouse数据库引擎解析
- ClickHouse(08)ClickHouse表引擎概况
- ClickHouse(09)ClickHouse合并树MergeTree家族表引擎之MergeTree详细解析
- ClickHouse(10)ClickHouse合并树MergeTree家族表引擎之ReplacingMergeTree详细解析
- ClickHouse(11)ClickHouse合并树MergeTree家族表引擎之SummingMergeTree详细解析
标签:
下一篇:最后一页
- 知识课堂 校园欺凌是什么
- 权威百科知识 双氧水是啥东西
- 生活知识 长颈鹿是什么动物
- 知识导航 涤纶是什么
- 经验分享 嵌入式什么意思
- 百科 梦醒时分粤语版叫什么
- 打破性别“玻璃天花板” 95岁女院士是“她力量”最佳代言
- 中国记者节|今天,一起揭秘他们的独门“武功秘籍”
- 内蒙古通辽遭遇特大暴雪:学校停课 机场关闭
- 河北辛集市暂停举办体育活动 关闭景区文娱场所
- 红色文物·党史故事 “推出胜利”的小推车
- 侵华日军南京大屠杀遇难同胞纪念馆闭馆
- 甘肃:已治愈出院18例 闭环健康管理助回归家庭
- 核酸采样:一位“点长”的50小时冲刺
- 跑道结冰 哈尔滨机场关闭至9日12时
- 辽宁大连迎今冬首场降雪 机场临时关闭跑道地铁3号线停运
- 北京地铁全面开启车内加热装置
- 黑河市多举措保障疫情期间残疾人等特殊群体生活稳定
- 北京丰台海淀两处管控区域解封 社区工作者收到“暖心礼物”
- 百年兰州牛肉面的“隔离与亲近”
- 暴雪侵袭黑龙江 9地市最大雪深17厘米
- 吉林四平一旅游项目违占耕地两千多亩 投资达10亿元
- 湖南双峰27名非法滞留缅北人员被惩戒:小孩回原籍入学
- 江西新增本土“1+6” 上饶增一中风险地区
- 江西上饶一地调整为中风险地区 实行封闭管理措施
- 西宁市主城区首轮全员核酸采集样本144.8万份 结果均为阴性
- 快递旺季遭遇雨雪天气 国家邮政局呼吁理解快递小哥
- 高压、孤独,胆大、心细:手执焊枪的水下“蛙人”
- 掏粪掏了36年,他还在琢磨“新门道”
- 内蒙古:二连浩特市新增1例本土确诊病例 额济纳旗累计治愈出院本土确诊病例76例
- 坚守在海拔4300多米的“天路保健医生”
- 38年后,他终于知道了家在哪儿……
- 受降雪影响 辽宁鞍山一农贸市场发生坍塌
- 中国舞蹈家协会顶尖教师巡回课堂(重庆站)举办
- 边城战“疫”:夜晚七点的暂停键
- 风雪高原战“疫”长卷 寒潮下的西宁疫情防控观察
- 拟音师:“雕刻”声音的人【三百六十行】
- “双减”之后 中小学教师资格考试为何依然火爆
- 大数据助力贫困生成长
- “大漠明珠”驶上发展快车道 塔里木盆地做足生态大文章
- 职校生可报考事业单位 搬走职业教育的一块绊脚石
- 打算“双十一”买买买的姐妹 看完这篇再“剁手”
- 完美“飞天”仰仗全宇宙最酷飞船试驾员
- 冠状病毒中损伤血管的蛋白首次确定
- 新电池结构让飞行汽车成为可能 相关技术将亮相北京冬奥
- H5N8病毒肆虐全球,我国家禽为何“独善其身”
- 重庆奉节一民警因公殉职 年仅28岁
- 哈尔滨市新增本土新冠肺炎确诊病例1例
- 成都本地累计在管密接2757人、次密9097人
- 成都累计报告确诊病例23例 出现1传13特殊案例
-
呼和浩特一学校宿管员扇打学生致双耳鼓膜穿孔 分管校长被免
中新网呼和浩特11月9日电 (记者 张林虎)9日,针对“宿管员扇打学生致其双耳鼓膜穿孔”一事,呼和...
-
郑州通报8例确诊病例和无症状感染者活动轨迹
中新网11月9日电 据郑州市委宣传部官方微信消息,11月8日0至24时,郑州市新增阳性感染者3例,均为...
-
新疆阿克苏果农:我们的生活像苹果一样甜
中新社新疆阿克苏11月9日电 题:新疆阿克苏果农:我们的生活像苹果一样甜 作者 苟继鹏 “我...
-
河北辛集开展大规模消毒消杀工作
今天(9日)上午,河北省辛集市召开疫情防控新闻发布会。会上,辛集市科学技术局局长辛彦卜介绍,新冠...
-
河北辛集新增本土确诊11例 已转运定点医院诊治
今天(9日)上午,河北省辛集市召开疫情防控新闻发布会,辛集市副市长刘士民介绍,2021年11月8日0时至...
-
石家庄深泽县第五轮全员核酸检测结果全部为阴性
11月9日,石家庄市召开第12场新冠肺炎疫情防控工作新闻发布会。发布会上,石家庄市深泽县县长郝英鹏...
-
海口市1例治愈后的境外输入病例复阳 已转至定点医院隔离医学观察
中新网海口11月8日电 (记者 张茜翼)海口市新型冠状病毒感染肺炎疫情防控工作指挥部8日通报称,11...
-
四川新增本土确诊病例4例
中新网11月8日电 据四川省卫健委网站消息,11月7日0-24时,四川新增新型冠状病毒肺炎确诊病例5例(...
-
黑龙江省新增新冠肺炎本土确诊病例6例
中新网哈尔滨11月8日电 (程岩 记者 史轶夫)黑龙江省卫健委8日发布消息,7日0-24时,黑龙江省黑河...
-
河南新增本土确诊病例18例 其中郑州市16例周口市2例
中新网11月8日电 据河南省卫健委官方微博消息,11月7日0—24时,河南省新增本土确诊病例18例(郑州...
-
河北新增确诊病例8例 新增无症状感染者1例
中新网11月8日电 据河北省卫健委网站消息,2021年11月7日0—24时,河北省新增新型冠状病毒肺炎确诊...
-
寒潮持续发威!南方气温纷纷触底 强降雪中心转移至东北
中国天气网讯 今天(11月8日),寒潮继续南下,持续发威,南方大部最高气温将纷纷触底。强降雪中心将...
-
雪后寒!今日北京晴天回归北风劲吹 最高气温5℃上下
中国天气网讯 今天(11月8日)北京晴天回归,但在风寒效应下,“冷”仍然是天气的主题。气温方面,今...
-
黑龙江新增本土确诊病例6例 均在黑河市爱辉区
中新网11月8日电 据黑龙江省卫健委网站消息,2021年11月7日0-24时,黑龙江省新增新冠肺炎本土确诊...
-
寒潮继续影响华东华南等地 东北地区等地有强降雪
中新网11月8日电 据中央气象台网站消息,受寒潮影响,预计11月8日08时至9日08时,黄淮东部、江淮东...
-
辽宁新增本土确诊病例20例 新增本土无症状感染者12例
中新网11月8日电 据辽宁省卫健委网站消息,11月7日0时至24时,辽宁省新增20例本土新冠肺炎确诊病例...
-
寒潮影响“加码”:吉林力保电力供应 停课停运范围加大
中新网长春11月9日电 (记者 郭佳 张瑶)连日来,一轮寒潮引发的强降雪席卷中国北方。位于东北地区...
-
常州连续一周无新增病例 10日全市各类学校将错峰复学
中新网常州11月9日电 (记者 唐娟)11月9日,常州疫情防控指挥部学校防控组对外发布,自11月10起,...
-
哈尔滨机场开放恢复运行 计划航班45架次
中新网哈尔滨11月9日电 (仇建 记者 史轶夫)9日12时22分,随着哈尔滨经阜阳飞往三亚的FU6685航班...
-
山西警方抓获6名“摸金校尉” 缴获“虎枕”等大量文物
中新网长治11月9日电 (记者 李庭耀)记者9日从山西省长治市公安局上党分局获悉,上党警方侦破系列...
-
西藏基层第一书记话产业发展推进乡村振兴
中新网日喀则11月9日电(记者 赵朗)近日,由西藏自治区网信办主办的第一书记话小康活动先后走进山南...
-
内蒙古通辽:强降雪致8个旗县区受灾
中新网通辽11月9日电 (记者 张林虎)9日,记者从内蒙古自治区通辽市应急管理局获悉,自11月5日起,...
-
成都金堂:医护人取消婚礼坚守岗位 手捧花被送到了战“疫”一线
中新网成都11月9日电 (邹立杨)连日来,华西医院金堂县第一人民医院实验医学科的主检验师易维佳都在...
-
江西铅山新一轮核酸检测结果均为阴性
(抗击新冠肺炎)江西铅山新一轮核酸检测结果均为阴性 中新网南昌11月9日电 (记者 吴鹏泉)江西省...
-
辽宁大连幼儿园和中小学学生即日起暂缓入校
中新网11月9日电 据辽宁省大连市人民政府新闻办公室官方微博消息,大连市新冠肺炎疫情防控总指挥部...
-
那年今日 | 一张漫画涨知识之11月8日
-
北京新增1例本土确诊病例
中新网11月8日电 据北京卫健委官方微博消息,11月7日0时至24时,北京新增1例本土确诊病例,无新增...
-
河北石家庄深泽县7日新增1例无症状感染者 为8岁男童
中新网11月8日电 据石家庄卫健委官方微信消息,石家庄深泽县应对新冠肺炎疫情工作领导小组办公室8...
-
高速封闭、机场关闭、学校停课 辽宁多部门发应急预案应对极端天气
中新网沈阳11月8日电 (李晛 王景巍)7日在寒潮影响下,东北地区局地降大雪。辽宁省气象部门当日连...
-
云南新增本土确诊病例3例 新增本土无症状感染者3例
中新网11月8日电 据云南省卫健委网站消息,11月7日0—24时,云南省新增确诊病例9例,其中境外输入...
-
努力让每个人都有出彩机会
努力让每个人都有出彩机会 “孩子明年要参加中考,成绩一直提不上去,送他读职高,也是一种选择...
-
参与和见证中国水电发展
参与和见证中国水电发展 余吉安的童年是在马来西亚加里曼丹岛的沙捞越州古晋市度过的。家门口的...
-
中国航天:为实现中国梦提供战略支撑
中国航天:为实现中国梦提供战略支撑(科技名家笔谈) 今年是中国共产党成立100周年,也是中国航...
-
8日起 江西铅山县开展新一轮全员核酸检测
记者从江西省铅山县疫情防控指挥部了解到,按照疫情防控要求,为了充分保障公众的健康安全,现定于1...
-
适当“早教”可以,“早早教”大可不必
一家之言 适当“早教”可以,“早早教”大可不必 以前国庆节是放假了,可家家都有娃,放假补...
X 关闭
X 关闭