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

这篇具有很好参考价值的文章主要介绍了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,再插入数据库,这时候,数据效果就是这样

Clickhouse表引擎之CollapsingMergeTree引擎的原理与使用,clickhouse,Java,clickhouse,数据库

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

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

写在最后

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

觉得有帮助的话,帮忙意见三连,感激涕零。
加油,铁子们!!!文章来源地址https://www.toymoban.com/news/detail-808790.html

到了这里,关于Clickhouse表引擎之CollapsingMergeTree引擎的原理与使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ClickHouse SQL与引擎--基本使用(一)

    1.查看所有的数据库 2.创建库 3.创建本地表 4.查看表结构 5如何使用表引擎    检测函数类型(clickhouse中数据的类型) 算数函数 求和 差值     求余数   取反   绝对值 最大公约数 最小公倍数 比较函数 比较函数(始终返回0表示false 或 1表示true) 逻辑函数 逻辑操作符(返回0表

    2024年02月14日
    浏览(70)
  • ClickHouse(九):Clickhouse表引擎 - Log系列表引擎

      进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,Kerberos安全认证,大数据OLAP体系技术栈-CSDN博客 📌订阅:拥抱独家专题,你的订阅将点燃我的创作热情! 👍点赞:赞同优秀创作

    2024年02月13日
    浏览(32)
  • ClickHouse10-ClickHouse中Kafka表引擎

    Kafka表引擎也是一种常见的表引擎,在很多大数据量的场景下,会从源通过Kafka将数据输送到ClickHouse,Kafka作为输送的方式,ClickHouse作为存储引擎与查询引擎,大数据量的数据可以得到快速的、高压缩的存储。 Kafka大家肯定不陌生: 它可以用于发布和订阅数据流,是常见的队

    2024年04月25日
    浏览(34)
  • ClickHouse(16)ClickHouse日志引擎Log详细解析

    这些引擎是为了需要写入许多小数据量(少于一百万行)的表的场景而开发的。 这系列的引擎有: StripeLog Log TinyLog 引擎: 数据存储在磁盘上。 写入时将数据追加在文件末尾。 不支持突变操作,也就是更新。 不支持索引。 非原子地写入数据。 Log 和 StripeLog 引擎支持: 并发

    2024年02月05日
    浏览(31)
  • ClickHouse(24)ClickHouse集成mongodb表引擎详细解析

    目录 MongoDB 创建一张表 用法示例 资料分享 系列文章 clickhouse系列文章 MongoDB 引擎是只读表引擎,允许从远程 MongoDB 集合中读取数据( SELECT 查询)。引擎只支持非嵌套的数据类型。不支持 INSERT 查询。 引擎参数 host:port — MongoDB 服务器地址. database — 数据库名称. collection — 集合

    2024年02月19日
    浏览(31)
  • ClickHouse(17)ClickHouse集成JDBC表引擎详细解析

    目录 JDBC 建表 用法示例 JDBC表函数 资料分享 系列文章 clickhouse系列文章 允许CH通过JDBC连接到外部数据库。 要实现JDBC连接,CH需要使用以后台进程运行的程序 clickhouse-jdbc-bridge。 该引擎支持Nullable数据类型。 引擎参数 datasource_uri — 外部DBMS的URI或名字. URI格式: jdbc:driver_name:

    2024年02月05日
    浏览(31)
  • ClickHouse(20)ClickHouse集成PostgreSQL表引擎详细解析

    目录 PostgreSQL 创建一张表 实施细节 用法示例 资料分享 系列文章 clickhouse系列文章 PostgreSQL 引擎允许 ClickHouse 对存储在远程 PostgreSQL 服务器上的数据执行 SELECT 和 INSERT 查询. 表结构可以与 PostgreSQL 源表结构不同: 列名应与 PostgreSQL 源表中的列名相同,但您可以按任何顺序使用

    2024年02月03日
    浏览(32)
  • ClickHouse(18)ClickHouse集成ODBC表引擎详细解析

    目录 创建表 用法示例 资料分享 系列文章 clickhouse系列文章 ODBC集成表引擎使得ClickHouse可以通过ODBC方式连接到外部数据库. 为了安全地实现 ODBC 连接,ClickHouse 使用了一个独立程序 clickhouse-odbc-bridge . 如果ODBC驱动程序是直接从 clickhouse-server 中加载的,那么驱动问题可能会导致

    2024年02月04日
    浏览(31)
  • ClickHouse(21)ClickHouse集成Kafka表引擎详细解析

    目录 Kafka表集成引擎 配置 Kerberos 支持 虚拟列 资料分享 系列文章 clickhouse系列文章 此引擎与Apache Kafka结合使用。 Kafka 特性: 发布或者订阅数据流。 容错存储机制。 处理流数据。 老版Kafka集成表引擎参数格式: 新版Kafka集成表引擎参数格式: 必要参数: kafka_broker_list – 以

    2024年02月02日
    浏览(31)
  • ClickHouse(23)ClickHouse集成Mysql表引擎详细解析

    MySQL引擎可以对存在远程MySQL服务器上的数据执行 SELECT 查询。 调用格式: 调用参数 host:port — MySQL 服务器地址。 database — 数据库的名称。 table — 表名称。 user — 数据库用户。 password — 用户密码。 replace_query — 将 INSERT INTO 查询是否替换为 REPLACE INTO 的标志。如果 replace

    2024年02月19日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包