09_ClickHouse,ReplacingMergeTree,案例,根据排序键去重,使用版本参数的去重(学习笔记)
7.ReplacingMergeTree
7.1.ReplacingMergeTree
7.2.案例
7.2.1.示例1:根据排序键去重
7.2.2.示例2:使用版本参数的去重
7.ReplacingMergeTree
7.1.ReplacingMergeTree
- 删除具有相同排序键值的重复项。
- 数据去重是在合并期间进行的。
- 后台的合并操作在未知的时间触发,因此用户无法对合并进行计划。
- 可使用OPTIMIZE语句运行计划外的合并,但OPTIMIZE是一个很重的操作。
- ReplacingMergeTree适合清除后台的重复数据以节省空间。
指定表引擎:
ENGINE = ReplacingMergeTree([ver])
参数:ver,版本列。版本列的类型为UInt*、Date或DateTime。可选参数。
合并的时候,ReplacingTree从所有相同主键的行中选择一行留下:如果ver未指定,选择最后一条。如果指定了ver列,选择ver值最大的版本。
7.2.案例
7.2.1.示例1:根据排序键去重
建表:
DROP TABLE replacingMergeTreeDemo;
CREATE TABLE replacingMergeTreeDemo
(UserID UInt32,CounterID UInt32,UserName String,EventDate Date
) ENGINE = ReplacingMergeTree()
ORDER BY (UserID, CounterID)
PRIMARY KEY (UserID);
执行效果:
xxxxx :) CREATE TABLE replacingMergeTreeDemo
:-] (
:-] UserID UInt32,
:-] CounterID UInt32,
:-] UserName String,
:-] EventDate Date
:-] ) ENGINE = ReplacingMergeTree()
:-] ORDER BY (UserID, CounterID)
:-] PRIMARY KEY (UserID);CREATE TABLE replacingMergeTreeDemo
(`UserID` UInt32,`CounterID` UInt32,`UserName` String,`EventDate` Date
)
ENGINE = ReplacingMergeTree()
PRIMARY KEY UserID
ORDER BY (UserID, CounterID)Ok.0 rows in set. Elapsed: 0.055 sec. xxxxx :)
2 插入数据
分三批次插入数据,为了观察效果,下面的三段脚本依次按顺序分别执行,不要一起执行:
批次1:
insert into replacingMergeTreeDemo values(1,100,'xiaohe1','2020-04-21');
insert into replacingMergeTreeDemo values(2,100,'xiaohe2','2020-04-22');
insert into replacingMergeTreeDemo values(3,102,'xiaohe3','2020-04-23');
插入后的效果为:
xxxxx :) select * from replacingMergeTreeDemo;SELECT *
FROM replacingMergeTreeDemo┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐
│ 3 │ 102 │ xiaohe3 │ 2020-04-23 │
└────────┴───────────┴──────────┴────────────┘
┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐
│ 2 │ 100 │ xiaohe2 │ 2020-04-22 │
└────────┴───────────┴──────────┴────────────┘
┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐
│ 1 │ 100 │ xiaohe1 │ 2020-04-21 │
└────────┴───────────┴──────────┴────────────┘3 rows in set. Elapsed: 0.009 sec. xxxxx :)
批次2:
insert into replacingMergeTreeDemo values(3,103,'xiaohe3','2020-04-23');
insert into replacingMergeTreeDemo values(2,101,'xiaohe2','2020-04-24');
insert into replacingMergeTreeDemo values(1,100,'xiaohe1','2020-04-20');
插入后的效果为:
xxxxx :) select * from replacingMergeTreeDemo;SELECT *
FROM replacingMergeTreeDemo┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐
│ 1 │ 100 │ xiaohe1 │ 2020-04-20 │
└────────┴───────────┴──────────┴────────────┘
┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐
│ 1 │ 100 │ xiaohe1 │ 2020-04-21 │
│ 2 │ 100 │ xiaohe2 │ 2020-04-22 │
│ 2 │ 101 │ xiaohe2 │ 2020-04-24 │
│ 3 │ 102 │ xiaohe3 │ 2020-04-23 │
│ 3 │ 103 │ xiaohe3 │ 2020-04-23 │
└────────┴───────────┴──────────┴────────────┘
批次3:
insert into replacingMergeTreeDemo values(2,100,'xiaohe2','2020-04-23');
插入后的效果:
xxxxx :) select * from replacingMergeTreeDemo;
SELECT *
FROM replacingMergeTreeDemo┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐
│ 2 │ 100 │ xiaohe2 │ 2020-04-23 │
└────────┴───────────┴──────────┴────────────┘
┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐
│ 1 │ 100 │ xiaohe1 │ 2020-04-20 │
└────────┴───────────┴──────────┴────────────┘
┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐
│ 1 │ 100 │ xiaohe1 │ 2020-04-21 │
│ 2 │ 100 │ xiaohe2 │ 2020-04-22 │
│ 2 │ 101 │ xiaohe2 │ 2020-04-24 │
│ 3 │ 102 │ xiaohe3 │ 2020-04-23 │
│ 3 │ 103 │ xiaohe3 │ 2020-04-23 │
└────────┴───────────┴──────────┴────────────┘7 rows in set. Elapsed: 0.007 sec. xxxxx :)
如上所示,它并没有合并数据,这时候需要手工执行计划外合并。
这时候就要手工执行计划外合并:
执行命令:optimize table replacingMergeTreeDemo
xxxxx :) optimize table replacingMergeTreeDemo;OPTIMIZE TABLE replacingMergeTreeDemoOk.0 rows in set. Elapsed: 0.003 sec. xxxxx :) select * from replacingMergeTreeDemo;SELECT *
FROM replacingMergeTreeDemo┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐
│ 1 │ 100 │ xiaohe1 │ 2020-04-20 │
│ 2 │ 100 │ xiaohe2 │ 2020-04-23 │
│ 2 │ 101 │ xiaohe2 │ 2020-04-24 │
│ 3 │ 102 │ xiaohe3 │ 2020-04-23 │
│ 3 │ 103 │ xiaohe3 │ 2020-04-23 │
└────────┴───────────┴──────────┴────────────┘5 rows in set. Elapsed: 0.006 sec. xxxxx :)
从这个示例可以发现,ReplacingMergeTree是根据排序项对数据去重的,而不是根据主键。
7.2.2.示例2:使用版本参数的去重
在示例1中, 我们简单观察可以发现, 去重后,保留的记录是最后一条记录。
如果指定了版本,则保留版本列的值最大的记录。
1.建表
使用EventDate列作为版本字段。
DROP TABLE replacingMergeTreeDemo;
CREATE TABLE replacingMergeTreeDemo
(UserID UInt32,CounterID UInt32,UserName String,EventDate Date
) ENGINE = ReplacingMergeTree(EventDate)
ORDER BY (UserID, CounterID)
PRIMARY KEY (UserID);
2.插入数据
批次1:
insert into replacingMergeTreeDemo values(1,100,'xiaohe1','2020-06-21');
insert into replacingMergeTreeDemo values(2,100,'xiaohe2','2020-11-27');
insert into replacingMergeTreeDemo values(3,102,'xiaohe3','2020-04-23');
批次2:
insert into replacingMergeTreeDemo values(3,103,'xiaohe3','2020-04-23');
insert into replacingMergeTreeDemo values(2,101,'xiaohe2','2020-04-24');
insert into replacingMergeTreeDemo values(1,100,'xiaohe1','2020-04-20');
批次3:
insert into replacingMergeTreeDemo values(2,100,'xiaohe2','2020-04-23');
查看数据:
xxxxx :) select * from replacingMergeTreeDemo;SELECT *
FROM replacingMergeTreeDemo┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐
│ 2 │ 100 │ xiaohe2 │ 2020-04-23 │
└────────┴───────────┴──────────┴────────────┘
┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐
│ 1 │ 100 │ xiaohe1 │ 2020-04-20 │
└────────┴───────────┴──────────┴────────────┘
┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐
│ 1 │ 100 │ xiaohe1 │ 2020-06-21 │
│ 2 │ 100 │ xiaohe2 │ 2020-11-27 │
│ 2 │ 101 │ xiaohe2 │ 2020-04-24 │
│ 3 │ 102 │ xiaohe3 │ 2020-04-23 │
│ 3 │ 103 │ xiaohe3 │ 2020-04-23 │
└────────┴───────────┴──────────┴────────────┘7 rows in set. Elapsed: 0.009 sec. xxxxx :) optimize table replacingMergeTreeDemo;OPTIMIZE TABLE replacingMergeTreeDemoOk.0 rows in set. Elapsed: 0.002 sec. xxxxx :) select * from replacingMergeTreeDemo;SELECT *
FROM replacingMergeTreeDemo┌─UserID─┬─CounterID─┬─UserName─┬──EventDate─┐
│ 1 │ 100 │ xiaohe1 │ 2020-06-21 │
│ 2 │ 100 │ xiaohe2 │ 2020-11-27 │
│ 2 │ 101 │ xiaohe2 │ 2020-04-24 │
│ 3 │ 102 │ xiaohe3 │ 2020-04-23 │
│ 3 │ 103 │ xiaohe3 │ 2020-04-23 │
└────────┴───────────┴──────────┴────────────┘5 rows in set. Elapsed: 0.005 sec. xxxxx :)
经过上面案例,可以看出,最终保留了如下数据:
│ 2 │ 100 │ xiaohe2 │ 2020-11-27 │
从这个示例可以发现, ReplacingMergeTree根据排序项对数据去重的, 保留版本字段列对应的最大值的记录。
09_ClickHouse,ReplacingMergeTree,案例,根据排序键去重,使用版本参数的去重(学习笔记)相关推荐
- ReplacingMergeTree,案例,根据排序键去重,使用版本参数的去重
1.ReplacingMergeTree 删除具有相同排序键值的重复项. 数据去重是在合并期间进行的. 后台的合并操作在未知的时间触发,因此用户无法对合并进行计划. 可使用OPTIMIZE语句运行计划 ...
- 输出dag的所有拓扑排序序列_算法学习笔记(53): 拓扑排序
拓扑排序是对DAG(有向无环图)上的节点进行排序,使得对于每一条有向边 , 都在 之前出现.简单地说,是在不破坏节点 先后顺序的前提下,把DAG拉成一条链.如果以游戏中的科技树(虽然名字带树,其实常常 ...
- 银行风控案例-python学习笔记
前言: 风险控制是挖掘中最为常见的应用,属于监督学习的"分类器"使用案例.我们通过以往历史数据判断用户违约的概率.本文使用了Logistic Regression 方法完成案例. ...
- 19_clickhouse,数据查询与写入优化,分布式子查询优化,外部聚合/排序优化,基于JOIN引擎的优化,SQL优化案例,物化视图提速,查询优化常用经验法则,选择和主键不一样的排序键,数据入库优化
25.数据查询与写入优化 25.1.分布式子查询优化 25.1.1.分布式表的IN查询示例1(普通IN子查询.IN子查询为本地表) 25.1.2.分布式表的IN查询示例2(普通IN子查询.IN子查询为 ...
- HBase建表高级属性,hbase应用案例看行键设计,HBase和mapreduce结合,从Hbase中读取数据、分析,写入hdfs,从hdfs中读取数据写入Hbase,协处理器和二级索引
1. Hbase高级应用 1.1建表高级属性 下面几个shell 命令在hbase操作中可以起到很到的作用,且主要体现在建表的过程中,看下面几个create 属性 1. BLOOMFILTER 默认是 ...
- 18_clickhouse副本同步与高可用功能验证,分布式表与集群配置,数据副本与复制表,ZooKeeper整合,创建复制表,副本同步机制,数据原子写入与去重,负载平衡策略,案例(学习笔记)
24.副本同步与高可用功能验证 24.1.分布式表与集群配置 24.2.数据副本与复制表 24.3.ZooKeeper整合 24.4.创建复制表 24.5.副本同步机制 24.6.数据原子写入与去重 ...
- 献给入门小白的MySQL学习笔记+案例
MySQL学习笔记 目录 MySQL学习笔记 1.SQL概述 1.1:数据库的好处 1.2:数据库管理系统 1.3:SQL语言概述 1.4:SQL语言的分类 2.安装与使用 2.1:MySql数据库产 ...
- MySQL数据库学习笔记,知识点和案例整理,期末三天复习完【简单且详细】
MySQL数据库近三万字学习笔记,超级详细! 文章目录 前言 一.day1 二.day2 三.day3 前言 MySQL数据库知识点和案例总结,非常详细,将近三万字!分成了三天去消化吸收! 一.day ...
- 学习笔记:SpringCloud 微服务技术栈_实用篇②_黑马旅游案例
若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 前言 学习视频链接 SpringCloud + RabbitMQ + Docker + Redis + 搜 ...
最新文章
- 使用MLX90640自制红外热像仪(一):MLX90640介绍与API库移植
- [NOIP模拟测试3] 建造游乐园 题解(欧拉图性质)
- 如何查看某oracle实例下面定义了多少jobs
- 特定于数据中心的人工智能完成任务的速度可以提高两倍
- 计算机辅助教学( ),27075 计算机辅助教学
- html日历显示不完整,求html代码,显示日历和时间的代码
- java ab工具_(ab)使用Java 8 FunctionalInterfaces作为本地方法
- (七)nodejs循序渐进-模块系统(进阶篇)
- Idea的一些调试技巧及设置todo
- c语言用于提示的指令,C语言指令、符号表.doc
- python输出被五整除的数_python中给定一系列正整数能被5整除的数字中所有偶数的和?...
- 心有所鼠,鼠年快乐~
- 《第一行代码》第三版之我的第一行Android代码(一)
- JSONP原理以及示例
- html把圆形分成10份,CSS八等分圆的实现示例
- [人工智能-综述-10]:模型评估 - 常见的模型评估指标与方法大全、汇总
- 第一次使用公有云需要注意啥
- 精简指令集(RISC)和复杂指令集(CISC)的区别
- 华为“美腿9”手机给我的惊艳!
- codewhy_vue笔记01
热门文章
- c语言标准io中可读可写,C语言标准IO: [先读再feof] VS [先feof再读]
- 《机器学习实战》第九章
- wxWidgets:wxSimpleHtmlListBox类用法
- boost::spirit模块实现利用 Karma 生成器的替代方案和内置匹配功能的测试程序
- boost::process::posix相关的测试程序
- boost::multi_array模块实现在矩阵上测试切片
- boost::mp11::mp_product相关用法的测试程序
- boost::multiprecision::float128用法的测试程序
- boost::local_time模块custom_time_zone 和 posix_time_zone 的简单示例
- boost::gregorian模块实现查找给定月份最后一天的测试程序