ClickHouse(十三):Clickhouse MergeTree系列表引擎 - ReplicingMergeTree

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

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

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

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

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

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


目录

1. ReplaceingMergeTree建表语句

2. 示例

2. 1测试去重按照Order by 字段进行去重,而不是按照primary 主键字段进行去重。

2.2 测试不指定[ver]列时,插入相同排序字段的数据,保留最新一条数据。

2.3 测试不同分区中有相同的Order by 字段时,不去重。


以上MergeTree不能对相同主键的数据进行去重,ClickHouse提供了ReplacingMergeTree引擎,可以针对同分区内相同主键的数据进行去重,它能够在合并分区时删除重复的数据。值得注意的是,ReplacingMergeTree只是在一定程度上解决了数据重复问题,由于自动分区合并机制在后台定时执行,所以并不能完全保障数据不重复。ReplacingMergeTree 适用于在后台清除重复的数据以节省空间。

1. ReplaceingMergeTree建表语句

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster](name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],...) ENGINE = ReplacingMergeTree([ver])[PARTITION BY expr][ORDER BY expr][SAMPLE BY expr][SETTINGS name=value, ...]
  • 以上建表语句的解释如下:
  • [ver] :可选参数,指定列的版本,可以是UInt*、Date或者DateTime类型的字段作为版本号。该参数决定了数据去重的方式。当没有指定[ver]时,保留最后插入的数据,也就是最新的数据;如果指定了具体的[ver]列,则保留最大版本数据。

使用ReplacingMergeTree是需要注意以下几点:

  • 如何判断数据重复

ReplacingMergeTree在去除重复数据时,是以ORDERBY排序键为基准的,而不是PRIMARY KEY。

  • 何时删除重复数据

在执行分区合并时,会触发删除重复数据。optimize的合并操作是在后台执行的,无法预测具体执行时间点,除非是手动执行。

  • 不同分区的重复数据不会被去重

ReplacingMergeTree是以分区为单位删除重复数据的。只有在相同的数据分区内重复的数据才可以被删除,而不同数据分区之间的重复数据依然不能被剔除。

  • 数据去重的策略是什么

如果没有设置[ver]版本号,则保留同一组重复数据中的最新插入的数据;如果设置了[ver]版本号,则保留同一组重复数据中ver字段取值最大的那一行。

  • optimize命令使用

一般在数据量比较大的情况,尽量不要使用该命令。因为在海量数据场景下,执行optimize要消耗大量时间。

2. 示例

2. 1测试去重按照Order by 字段进行去重,而不是按照primary 主键字段进行去重。

#创建表 t_replacing_mt ,使用ReplacingMergeTree引擎node1 :) create table t_replacing_mt(:-] id UInt8,:-] name String,:-] age UInt8,:-] gender String:-] ) engine = ReplacingMergeTree():-] order by (id,age):-] primary key id:-] partition by gender;#向表 t_replacing_mt 中插入以下数据:node1 :) insert into t_replacing_mt values (1,'张三',18,'男'),:-] (2,'李四',19,'女'),:-] (3,'王五',20,'男');#查询表 t_replacing_mt 中的数据:node1 :) select * from t_replacing_mt;┌─id─┬─name─┬─age─┬─gender─┐│  2   │ 李四    │  19   │ 女        │└───┴────┴────┴──────┘┌─id─┬─name─┬─age─┬─gender─┐│  1   │ 张三    │  18    │ 男       ││  3   │ 王五    │  20    │ 男       │└───┴────┴────┴──────┘#向表 t_replacing_mt  中插入id 为1的一行数据node1 :) insert into t_replacing_mt values (1,'张三',10,'男');#查询表 t_replacing_mt  数据:node1 :) select * from t_replacing_mt;┌─id─┬─name─┬─age─┬─gender─┐│  1  │ 张三  │  10 │ 男       │└────┴──────┴─────┴────────┘┌─id─┬─name─┬─age─┬─gender─┐│  1  │ 张三  │  18 │ 男       ││  3  │ 王五  │  20 │ 男       │└────┴──────┴─────┴────────┘┌─id─┬─name─┬─age─┬─gender─┐│  2 │ 李四  │  19  │ 女       │└────┴──────┴─────┴────────┘#执行 optimize命令手动合并分区数据node1 :) optimize table t_replacing_mt;#查询表 t_replacing_mt  数据,发现没有按照primary key 去重。node1 :) select * from t_replacing_mt;┌─id─┬─name─┬─age─┬─gender─┐│  2  │ 李四  │  19 │ 女       │└────┴──────┴─────┴────────┘┌─id─┬─name─┬─age─┬─gender─┐│  1  │ 张三  │  10 │ 男       ││  1  │ 张三  │  18 │ 男       ││  3  │ 王五  │  20 │ 男       │└────┴──────┴─────┴────────┘#再次向表  t_replacing_mt  插入数据:node1 :) insert into t_replacing_mt values (1,'张三三',18,'男');#查询表 t_replacing_mt  数据node1 :) select * from t_replacing_mt;┌─id─┬─name───┬─age─┬─gender─┐│  1    │ 张三三     │  18   │ 男        │└───┴──────┴────┴──────┘┌─id─┬─name─┬─age─┬─gender─┐│  2   │ 李四    │  19    │ 女       │└───┴────┴────┴──────┘┌─id─┬─name─┬─age─┬─gender─┐│  1    │ 张三   │  10   │  男       ││  1    │ 张三   │  18   │ 男        ││  3    │ 王五   │  20   │ 男        │└───┴─────┴───┴──────┘#再次执行 optimize命令手动合并分区数据node1 :) optimize table t_replacing_mt;#查询表 t_replacing_mt  数据node1 :) select * from t_replacing_mt;┌─id─┬─name─┬─age─┬─gender─┐│  2   │ 李四    │  19   │ 女        │└───┴────┴────┴──────┘┌─id─┬─name───┬─age─┬─gender─┐│  1   │ 张三        │  10   │ 男        ││  1   │ 张三三      │  18   │ 男        ││  3   │ 王五        │  20   │ 男        │└───┴──────┴────┴─────┘注意:通过以上测试发现ClickHouse ReplacingMergeTree中去除重复数据时,是以ORDERBY排序键为基准的,而不是PRIMARY KEY。

2.2 测试不指定[ver]列时,插入相同排序字段的数据,保留最新一条数据。

#删除表 t_replacing_mt 重建,使用ReplacingMergeTree引擎node1 :) create table t_replacing_mt(:-] id UInt8,:-] name String,:-] age UInt8,:-] gender String:-] ) engine = ReplacingMergeTree():-] order by id:-] primary key id:-] partition by gender;#向表 t_replacing_mt 中插入以下数据node1 :) insert into t_replacing_mt values (1,'张三',18,'男'),:-] (2,'李四',19,'女'),:-] (3,'王五',20,'男');#查询表 t_replacing_mt 中的数据node1 :) select * from t_replacing_mt ;┌─id─┬─name─┬─age─┬─gender─┐│  2  │ 李四  │  19  │ 女      │└────┴──────┴─────┴────────┘┌─id─┬─name─┬─age─┬─gender─┐│  1  │ 张三  │  18  │ 男      ││  3  │ 王五  │  20  │ 男      │└────┴──────┴─────┴────────┘#向表 t_replacing_mt 中插入排序字段相同的一行数据node1 :) insert into t_replacing_mt values (1,'张三',10,'男');#查询表 t_replacing_mt 中的数据node1 :) select * from t_replacing_mt;┌─id─┬─name─┬─age─┬─gender─┐│  1  │ 张三  │  10  │ 男      │└────┴──────┴─────┴────────┘┌─id─┬─name─┬─age─┬─gender─┐│  2  │ 李四  │  19  │ 女      │└────┴──────┴─────┴────────┘┌─id─┬─name─┬─age─┬─gender─┐│  1  │ 张三  │  18  │ 男      ││  3  │ 王五  │   20 │ 男      │ └────┴──────┴─────┴────────┘#执行 optimize命令手动合并分区数据node1 :) optimize table t_replacing_mt;#查询表 t_replacing_mt 中的数据node1 :) select * from t_replacing_mt;┌─id─┬─name─┬─age─┬─gender─┐│  2  │ 李四  │  19  │ 女      │└────┴──────┴─────┴────────┘┌─id─┬─name─┬─age─┬─gender─┐│  1  │ 张三  │  10  │ 男      ││  3  │ 王五  │  20  │ 男      │└────┴──────┴─────┴────────┘注意:通过以上测试可以发现,ClickHouse ReplacingMergeTree中不指定[ver]列时,当插入排序字段相同的数据时,保留最新一条数据。测试指定[ver]列时,插入相同排序字段的数据,保留当前[ver]列最大值。
#删除表 t_replacing_mt 重新创建,使用ReplacingMergeTree引擎,指定[ver]node1 :) create table t_replacing_mt(:-] id UInt8,:-] name String,:-] age UInt8,:-] gender String:-] ) engine = ReplacingMergeTree(age):-] order by id:-] primary key id:-] partition by gender;#向表 t_replacing_mt 中插入数据:node1 :) insert into t_replacing_mt values (1,'张三',18,'男'),:-] (2,'李四',19,'女'),:-] (3,'王五',20,'男');#查询表 t_replacing_mt中数据:node1 :) select * from t_replacing_mt ;┌─id─┬─name─┬─age─┬─gender─┐│  1  │ 张三  │  18  │ 男      ││  3  │ 王五  │  20  │ 男      │└────┴──────┴─────┴────────┘┌─id─┬─name─┬─age─┬─gender─┐│  2  │ 李四  │  19  │ 女      │└────┴──────┴─────┴────────┘#向表 t_replacing_mt 中插入排序字段相同的一行数据node1 :) insert into t_replacing_mt values (1,'张三',10,'男');#查看表 t_replacing_mt中的数据node1 :) select * from t_replacing_mt;┌─id─┬─name─┬─age─┬─gender─┐│  1  │ 张三  │  10  │ 男      │└────┴──────┴─────┴────────┘┌─id─┬─name─┬─age─┬─gender─┐│  1 │ 张三  │  18  │ 男       ││  3 │ 王五  │  20  │ 男       │└────┴──────┴─────┴────────┘┌─id─┬─name─┬─age─┬─gender─┐│  2  │ 李四  │  19  │ 女      │└────┴──────┴─────┴────────┘#对表 t_replacing_mt中的数据执行手动分区合并node1 :) optimize table t_replacing_mt;#查看表 t_replacing_mt中的数据node1 :) select * from t_replacing_mt;┌─id─┬─name─┬─age─┬─gender─┐│  2 │ 李四  │  19  │ 女       │└────┴──────┴─────┴────────┘┌─id─┬─name─┬─age─┬─gender─┐│  1  │ 张三  │  18 │ 男       ││  3 │ 王五   │  20 │ 男       │└────┴──────┴─────┴────────┘注意:通过以上测试可以发现,在ClickHouse中创建ReplacingMergeTree时,如果指定了[ver]列,当存在Order by字段重复时,会保留ver列最大值对应的行。

2.3 测试不同分区中有相同的Order by 字段时,不去重。

#删除表 t_replacing_mt ,重新创建node1 :) create table t_replacing_mt(:-] id UInt8,:-] name String,:-] age UInt8,:-] gender String:-] ) engine = ReplacingMergeTree():-] order by id:-] primary key id:-] partition by gender;#向表 t_replacing_mt 中插入以下数据:node1 :) insert into t_replacing_mt values (1,'张三',18,'男'),:-] (2,'李四',19,'女'),:-] (3,'王五',20,'男');#再次向表 t_replacing_mt 中插入以下数据:node1 :) insert into t_replacing_mt values (1,'张三三',10,'女');#对表 t_replacing_mt中的数据执行手动分区合并node1 :) optimize table t_replacing_mt;#查看表中的数据node1 :) select * from t_replacing_mt;┌─id─┬─name───┬─age─┬─gender─┐│  1   │ 张三三      │  10   │ 女        ││  2   │ 李四        │  19   │ 女        │└───┴──────┴────┴─────┘┌─id─┬─name─┬─age─┬─gender─┐│  1   │ 张三    │  18   │ 男        ││  3   │ 王五    │  20   │ 男        │└───┴────┴────┴─────┘注意:通过以上测试可以发现,在ClickHouse中创建ReplacingMergeTree时,不同分区中相同的Order by 字段不会去重。

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


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

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

相关文章

Nginx反向代理配置+负载均衡集群部署

文章目录 负载均衡反向代理基础环境部署:什么是代理实验环境图流量过程 环境部署准备两台Web服务器安装Nginx准备页面内容添加主机名 代理服务器配置 修改windos hosts文件测试:终端浏览器 负载均衡反向代理基础环境部署: 什么是代理 正向代…

爬虫学习记录(持续更新)

一、问题记录 1.使用webdriver报错AttributeError: str object has no attribute capabilities 解决:目前使用的selenium版本是4.11.2,可以不必设置driver.exe的路径,selenium可以自己处理浏览器和驱动程序,因此,使用…

八月组队学习来了!

Datawhale学习 联合主办:Datawhale,人民邮电出版社 本期学习由Datawhale和人民邮电出版社异步社区联合发起,学习大纲如下(文末整理了这次学习的所有资料): 参与学习 ▶ 活动时间:学习活动 8月1…

二叉树(4)------收尾

1)最大二叉树 654. 最大二叉树 - 力扣(LeetCode) 题目解析: 1)首先我们找到了整个数组中最大的元素作为我们的根节点,然后再从左区间中找到最大的元素作为当前根节点的左子树,然后再从右区间里面找到最大的元素作为根节点的右子树…

直接在html中引入Vue.js的cdn来实现一个简单的博客

摘要 其实建立一个博客系统是非常简单的&#xff0c;有很多开源的程序&#xff0c;如果你不喜欢博客系统&#xff0c;也可以自己开发&#xff0c;也可以自己简单做一个。我这次就是用Vue.js和php做后端服务实现一个简单的博客。 界面 代码结构 代码 index.html <!DOCTYP…

maven的入门使用

maven的入门使用 1.Maven&#xff08;Maven Apache&#xff09;是一个流行的项目构建和管理工具&#xff0c;2.项目结构和POM文件&#xff1a;3.POM文件&#xff08;Project Object Model&#xff09;4.依赖管理&#xff1a; 在POM文件中5.生命周期和构建过程1.前言2.插件系统3…

uni-app使用vue语法进行开发注意事项

目录 uni-app 项目目录结构 生命周期 路由 路由跳转 页面栈 条件编译 文本渲染 样式渲染 条件渲染 遍历渲染 事件处理 事件修饰符 uni-app 项目目录结构 组件/标签 使用&#xff08;类似&#xff09;小程序 语法/结构 使用vue 具体项目目录如下&#xff1a; 生命…

【深度学习注意力机制系列】—— SENet注意力机制(附pytorch实现)

深度学习中的注意力机制&#xff08;Attention Mechanism&#xff09;是一种模仿人类视觉和认知系统的方法&#xff0c;它允许神经网络在处理输入数据时集中注意力于相关的部分。通过引入注意力机制&#xff0c;神经网络能够自动地学习并选择性地关注输入中的重要信息&#xff…

Scikit-learn聚类方法代码批注及相关练习

一、代码批注 代码来自&#xff1a;https://scikit-learn.org/stable/auto_examples/cluster/plot_dbscan.html#sphx-glr-auto-examples-cluster-plot-dbscan-py import numpy as np from sklearn.cluster import DBSCAN from sklearn import metrics from sklearn.datasets …

DNS部署与安全详解(下)

文章目录 前言一、指定区域解析配置二、DNS服务器对外名称显示配置三、转发器使用配置四、配置辅助&#xff08;备份&#xff09;服务器五、如何让虚拟机可以真实上网六、为DNS服务器配置别名 前言 上一篇博客我们已经在Windows server2003的虚拟机上下载了DNS软件&#xff0c;…

SQL-每日一题【1251. 平均售价】

题目 Table: Prices Table: UnitsSold 编写SQL查询以查找每种产品的平均售价。average_price 应该四舍五入到小数点后两位。 查询结果格式如下例所示&#xff1a; 解题思路 1.题目要求查询每种产品的平均售价。给出了两个表&#xff0c;我们用聚合查询来解决此问题。 2.首先我…

Samba(二)

问题 Rocky Linux使用smbclient访问win11的共享文件时提示 Error NT_STATUS_IO_TIMEOUT 分析 通过测试&#xff0c;发现关闭windows公用网络防火墙时&#xff0c;可正常显示服务器端所分享出来的所有资源&#xff1b;进一步发现单独放行防火墙进站规则中的文件和打印机共享&a…

20、stm32使用FMC驱动SDRAM(IS42S32800G-6BLI)

本文将使用安富莱的STM32H743XIH板子驱动SDRAM 引脚连接情况 一、CubeMx配置工程 1、开启调试口 2、开启外部高速时钟 配置时钟树 3、开启串口1 4、配置MPU 按照安富莱的例程配置&#xff1a; /* ********************************************************************…

什么是POP3协议?

POP3&#xff08;Post Office Protocol Version 3&#xff09;是一个用于从电子邮件服务器获取邮件的应用层协议。以下是关于POP3的详细解释&#xff1a; 基本操作&#xff1a;使用POP3&#xff0c;电子邮件客户端可以从邮件服务器上下载电子邮件&#xff0c;并将其保存在本地。…

【JPCS出版】第五届能源、电力与电网国际学术会议(ICEPG 2023)

第五届能源、电力与电网国际学术会议&#xff08;ICEPG 2023&#xff09; 2023 5th International Conference on Energy, Power and Grid 最近几年&#xff0c;不少代表委员把目光投向能源电力领域&#xff0c;对促进新能源发电产业健康发展、电力绿色低碳发展&#xff0c;提…

cpu的架构

明天继续搞一下cache,还有后面的, 下面是cpu框架图 开始解释cpu 1.控制器 控制器又称为控制单元&#xff08;Control Unit&#xff0c;简称CU&#xff09;,下面是控制器的组成 1.指令寄存器IR:是用来存放当前正在执行的的一条指令。当一条指令需要被执行时&#xff0c;先按…

【C语言】指针的进阶2

指针进阶 函数指针数组指向函数指针数组的指针回调函数指针和数组经典题目的解析 函数指针数组 数组是一个存放相同类型数据的存储空间&#xff0c;那我们已经学习了指针数组&#xff0c; 比如&#xff1a; int* arr[10];//数组的每个元素是int*那要把函数的地址存到一个数组…

无涯教程-Perl - getpwnam函数

描述 此函数基于EXPR指定的用户名,从/etc/passwd文件提取的列表context中返回字段列表。通常这样使用- ($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,$shell) getpwnam($user); 在标量context中,返回数字用户ID。如果尝试访问整个/etc/passwd文件,则应使用getpwent…

Lecoode有序数组的平方977

题目建议&#xff1a; 本题关键在于理解双指针思想 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a; 双指针法经典题目 | LeetCode&#xff1a;977.有序数组的平方_哔哩…

【Linux】内核宏定义解释postcore_initcall,arch_initcall,subsys_initcall

postcore_initcall postcore_initcall(pcibus_class_init) 是一个宏&#xff0c;用于在Linux内核初始化过程中注册一个后期初始化函数。 这个宏的含义如下&#xff1a; postcore_initcall 是一个宏定义&#xff0c;用于指定注册的函数在内核初始化的哪个阶段执行。 pcibus_cl…