Clickhouse表引擎之CollapsingMergeTree引擎的原理与使用

前言

继续上次关于clickhouse的一些踩坑点,今天讲讲另外一个表引擎——CollapsingMergeTree。这个对于引擎对于数据量较大的场景是个不错的选择。注意,选择clickhouse的一般原因都是为了高效率查询,提高用户体验感,说白了就是以空间换时间,clickhouse的一个关键设计就是数据的合并。

CollapsingMergeTree官方文档说明

该引擎继承于 MergeTree,并在数据块合并算法中添加了折叠行的逻辑。

CollapsingMergeTree 会异步的删除(折叠)这些除了特定列 Sign 有 1 和 -1 的值以外,其余所有字段的值都相等的成对的行。没有成对的行会被保留。

注意:折叠其实就是跟合并概念类似的意思,这个时间是不一定的,有可能马上合并,有可能过一阵子合并,根本原因是因为合并数据涉及频繁的磁盘IO和空间占用。我猜测它合并一般选择数据库使用频率较低的时候合并。

这个说明什么意思呢?

如果仔细阅读,应该可以理解。就是说,创建表的时候,需要指定一个字段,比如官方的字段用sign表示,用来存一个标志位,标志位只能为-1和1。这样后面如果存在两条记录,除了标志位不一样以外,其他字段完全相同,那么在后续后台数据合并的时候,这两条数据会被相互抵消,彻底地被物理删除。

实操讲解

创建一张表
CREATE TABLE IF NOT EXISTS test (
		`advertiser_account_group_id` Int64 COMMENT '项目ID',
		`landing_page_id` Int64 COMMENT '落地页ID',
		`statistic_date` DateTime COMMENT '统计日期',
		`landing_page_channel_id` Int64 COMMENT '渠道ID',
		`page_view_num` Int64 DEFAULT 0 COMMENT '浏览数',
		`form_submit_num` Int64 DEFAULT 0 COMMENT '表单提交数',
		`sign` INT8 COMMENT '标志位' 
	) ENGINE = CollapsingMergeTree ( sign ) 
PARTITION BY toYYYYMM ( statistic_date ) 
PRIMARY KEY ( advertiser_account_group_id, landing_page_id, landing_page_channel_id, statistic_date ) 
ORDER BY( advertiser_account_group_id, landing_page_id, landing_page_channel_id, statistic_date ) 
COMMENT '测试表';
插入一条sign = 1的数据
INSERT INTO test3 ( advertiser_account_group_id, landing_page_id, landing_page_channel_id, statistic_date, page_view_num, form_submit_num, sign )VALUES(1,2,3,'2024-01-14 11:00:00',10,20,1)

这时候表里只有这一条标志位为1的数据,并且它不存在一条标志位为-1的数据,他就会一直存在于数据库中。假设这个数据我洗错了,需要对他进行修正,因为我这次的业务,涉及到清理的历史数据量级是数十亿的广告pv数据,所以不能直接对表记录进行更新,这个是clickhouse数据库的一个瓶颈。那怎么办呢,我这里是按照天维度进行数据清洗,所以在重新插入修正后的数据之前,先要查询出来我这个时间段内的历史数据,把查询出来的数据,将sign置为-1,再重新插一份到数据库,利用CollapsingMergeTree表隐情的折叠机制自动进行删除。这个过程,查询历史数据的步骤非常关键,按照官方文档里面,涉及数值的字段,需要用sum函数进行查询,SQL如下:

SELECT
	advertiser_account_group_id,
	landing_page_id,
	landing_page_channel_id,
	statistic_date,
	sum( page_view_num * sign ) AS page_view_num,
	sum( form_submit_num * sign ) AS form_submit_num 
FROM
	test3 
	where statistic_date BETWEEN '2024-01-14 00:00:00' and '2024-01-14 23:59:59'
GROUP BY
	advertiser_account_group_id,
	landing_page_id,
	landing_page_channel_id,
	statistic_date 
HAVING
	sum( sign ) > 0

这里一定要这样写,不能直接用如下的SQL写,否则你查询数来的数据大概率是错的:

    SELECT
	advertiser_account_group_id,
	landing_page_id,
	landing_page_channel_id,
	statistic_date,
    sum(page_view_num),
    sum(form_submit_num)
FROM
	test3
	where statistic_date BETWEEN '2024-01-14 00:00:00' and '2024-01-14 23:59:59' and sign > 0
GROUP BY
	advertiser_account_group_id,
	landing_page_id,
	landing_page_channel_id,
	statistic_date

假设我在原有只有一条数据的基础上,再插一条标志位为-1的数据,其他字段一模一样

INSERT INTO test3 ( advertiser_account_group_id, landing_page_id, landing_page_channel_id, statistic_date, page_view_num, form_submit_num, sign )VALUES(1,2,3,'2024-01-14 11:00:00',10,20,-1)

如果直接使用第二个SQL查询,那么查询出来的结果就是第一条数据,如果数据还没有进行合并,我们查出来之后,再次将这一条数据sign = 1的数据设置成sign = -1,再插入数据库,这时候,数据效果就是这样

会存在两条sign=-1的数据,如果后面反复执行这个清洗任务,你插入的数据除了标志位不一样,其他都是一样的情况下,你会发现,你的数据怎么莫名其妙消失了,因为可能会出现你的sign = 1的数据跟数据库里面sign = -1的数据折叠抵消了。因为它合并的时间是不一定的,有可能马上合并,有可能几天之后才合并,所以如果你查询的姿势不对,你的数据就会一直错下去。

所以,正确的查询姿势,必须按照文档说明的取查询,案例可以直接查看官网的Demo或者我的这个也可以。

写在最后

好了,今天的内容就分享到这里,这篇文章有需要的可以好好收藏理解一下,在使用clickhouse的场景中,是个非常不错的选择。它的设计很巧妙,clickhouse还是很强大的,就是需要理解它的文档说明,姿势对了,他就很香,欢迎持续关注"安前码后",点击下方名片页,更多工作中实用干货会持续输出中。

觉得有帮助的话,帮忙意见三连,感激涕零。
加油,铁子们!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

blender 导入到 Marvelous Designer

1) 将模型的所有部分合并为一个单独的mesh 2) 先调整计量单位: 3)等比缩放,身高调整到180cm左右 4)应用当前scale 首先,选中你要修改的物体,然后按下Ctrl-A键,打开应用…

蓝桥杯练习题(九)

📑前言 本文主要是【算法】——蓝桥杯练习题(九)的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 …

数据结构学习笔记——查找算法中的树形查找(红黑树)

目录 一、红黑树的定义(一)黑/红结点、叶子节点(二)黑色完美平衡 二、红黑树的性质(一)黑高和高度(二)叶子结点个数 三、红黑树与AVL对比 一、红黑树的定义 红黑树是一棵二叉排序树…

【OpenGauss源码学习 —— 执行器(execMain)】

执行器(execMain) 概述文件内容作用执行的操作主要函数概述 部分函数详细分析ExecutorStart 函数standard_ExecutorStart 函数 ExecutorRun 函数standard_ExecutorRun 函数 ExecutorFinish 函数standard_ExecutorFinish 函数 ExecutorEnd 函数standard_E…

数据库单表查询

1、显示所有职工的基本信息。 2、查询所有职工所属部门的部门号,不显示重复的部门号。 3、求出所有职工的人数。 4、列出最高工和最低工资。 5、列出职工的平均工资和总工资。 6、创建一个只有职工号、姓名和参加工作的新表,名为工作日期表…

基于PyQT的图片批处理系统

项目背景: 随着数字摄影技术的普及,人们拍摄和处理大量图片的需求也越来越高。为了提高效率,开发一个基于 PyQt 的图片批处理系统是很有意义的。该系统可以提供一系列图像增强、滤波、水印、翻转、放大缩小、旋转等功能,使用户能够…

单容水箱液位定值控制实验

实验1 单容水箱液位定值控制实验 一、实验目的 1、通过实验熟悉单回路反馈控制系统的组成和工作原理。 2、分析分别用P、PI和PID调节时的过程图形曲线。 3、定性地研究P、PI和PID调节器的参数对系统性能的影响。 二、实验设备 A3000现场系统,任何一个控制系统…

Java项目:03 基于Springboot的销售培训考评管理系统

项目介绍 企业的销售要进行培训,由技术人员进行辅导并考评检测培训效果,所以有了这个小系统。实现了系统的登录验证、请求拦截验证、基础模块(用户管理、角色管理、销售管理)、业务模块(评分管理、评分结果&#xff0…

springboot 企业微信 网页授权

html 引入jquery $(function () {// alert("JQ onready");// 当前企业的 corp_idconst corp_id xxxxxx;// 重定向 URL → 最终打开的画面地址,域名是在企业微信上配置好的域名const redirect_uri encodeURI(http://xxxxx.cn);//企业的agentId 每个应用都…

基于SpringBoot的房屋交易平台的设计与实现

🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅一 、设计说明 1.1 研究背景 互…

Nightingale 夜莺监控系统 - 部署篇(1)

Author:rab 官方文档:https://flashcat.cloud/docs 目录 一、概述二、架构2.1 中心机房架构2.2 边缘下沉式混杂架构 三、环境四、部署4.1 中心机房架构部署4.1.1 MySQL4.1.2 Redis4.1.3 Prometheus4.1.4 n9e4.1.5 Categraf4.1.6 验证4.1.7 配置数据源 4…

安装、运行和控制AI apps在您的计算机上一键式

pinokio 你是否曾为安装、运行和自动化 AI 应用程序和大模型而感到困惑?是否希望有一个简单而强大的工具来满足你的需求?如果是这样,那么 Pinokio 将会是你的理想选择!Pinokio 是一款革命性的人工智能浏览器,是一个开…

专业课140+总分410+电子科技大学858信号与系统考研经验,电子信息通信

我的初试备考从4月末,持续到初试前,这中间没有中断。 我是二战考生,准备的稍微晚一些,如果是一战考生,建议在2、3月份开始。 总的时间分配上,是数学>专业课>英语>政治,虽然大家可支配…

Python如何免费调用微软Bing翻译API

一、引言 现在免费的机器翻译越来越少了,随着有道翻译开始收费,百度降低用户的免费机器翻译额度(目前只有实名认证过的高级用户才能获得100万字符的免费翻译额度),而亚马逊、腾讯等机器翻译调用相对比较麻烦,需要下载各种插件包&…

【代码随想录05】242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

目录 242.有效的字母异位词题目描述做题思路参考代码 349. 两个数组的交集题目描述做题思路参考代码 202. 快乐数题目描述做题思路参考代码 1.两数之和题目描述参考代码 242.有效的字母异位词 题目描述 给定两个字符串 *s* 和 *t* ,编写一个函数来判断 *t* 是否是…

使用swift创建第一个ios程序

一、安装xcode 先到app store中下载一个Xcode app 二、创建项目 1、项目设定 创建ios app 2、工程结构 三、修改代码实现按键联动 四、运行测试

时序预测 | MATLAB实现GRNN广义回归神经网络时间序列未来多步预测(程序含详细预测步骤)

时序预测 | MATLAB实现GRNN广义回归神经网络时间序列未来多步预测(程序含详细预测步骤) 目录 时序预测 | MATLAB实现GRNN广义回归神经网络时间序列未来多步预测(程序含详细预测步骤)预测效果基本介绍程序设计参考资料预测效果 基本介绍 MATLAB实现GRNN广义回归神经网络时间序列…

【Windows】基于Hyper-V安装Ubuntu虚拟机

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍基于Hyper-V安装Ubuntu虚拟机。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新…

使用kibana来创建ElasticSearch的索引库与文档的命令

文章目录 🐒个人主页🏅JavaEE系列专栏📖前言:🎀使用kibana来为ElasticSearch创建索引库🎀使用kibana来为ElasticSearch创建修改文档 🐒个人主页 🏅JavaEE系列专栏 📖前言…

粒子群算法优化RBF神经网络回归分析

目录 完整代码和数据下载链接:粒子群算法优化RBF神经网络回归分析(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88738570 RBF的详细原理 RBF的定义 RBF理论 易错及常见问题 RBF应用实例,基于rbf的空调功率预测 代码 结果分析 展望…