做网站和彩票的同步开奖怎么做,王烨江婉柔,帝国cms 做网站地图,招远建网站首选公司进入正文前#xff0c;感谢宝子们订阅专题、点赞、评论、收藏#xff01;关注IT贫道#xff0c;获取高质量博客内容#xff01; #x1f3e1;个人主页#xff1a;含各种IT体系技术#xff0c;IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 … 进入正文前感谢宝子们订阅专题、点赞、评论、收藏关注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 namevalue, ...]
以上建表语句的解释如下[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 字段不会去重。 如需博文中的资料请私信博主。