7.ReplacingMergeTree
7.1.ReplacingMergeTree
7.2.案例
7.2.1.示例1:根据排序键去重
7.2.2.示例2:使用版本参数的去重

7.ReplacingMergeTree

7.1.ReplacingMergeTree

  1. 删除具有相同排序键值的重复项。
  2. 数据去重是在合并期间进行的。
  3. 后台的合并操作在未知的时间触发,因此用户无法对合并进行计划。
  4. 可使用OPTIMIZE语句运行计划外的合并,但OPTIMIZE是一个很重的操作。
  5. 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,案例,根据排序键去重,使用版本参数的去重(学习笔记)相关推荐

  1. ReplacingMergeTree,案例,根据排序键去重,使用版本参数的去重

    1.ReplacingMergeTree 删除具有相同排序键值的重复项. 数据去重是在合并期间进行的. 后台的合并操作在未知的时间触发,因此用户无法对合并进行计划. 可使用OPTIMIZE语句运行计划 ...

  2. 输出dag的所有拓扑排序序列_算法学习笔记(53): 拓扑排序

    拓扑排序是对DAG(有向无环图)上的节点进行排序,使得对于每一条有向边 , 都在 之前出现.简单地说,是在不破坏节点 先后顺序的前提下,把DAG拉成一条链.如果以游戏中的科技树(虽然名字带树,其实常常 ...

  3. 银行风控案例-python学习笔记

    前言: 风险控制是挖掘中最为常见的应用,属于监督学习的"分类器"使用案例.我们通过以往历史数据判断用户违约的概率.本文使用了Logistic Regression 方法完成案例. ...

  4. 19_clickhouse,数据查询与写入优化,分布式子查询优化,外部聚合/排序优化,基于JOIN引擎的优化,SQL优化案例,物化视图提速,查询优化常用经验法则,选择和主键不一样的排序键,数据入库优化

    25.数据查询与写入优化 25.1.分布式子查询优化 25.1.1.分布式表的IN查询示例1(普通IN子查询.IN子查询为本地表) 25.1.2.分布式表的IN查询示例2(普通IN子查询.IN子查询为 ...

  5. HBase建表高级属性,hbase应用案例看行键设计,HBase和mapreduce结合,从Hbase中读取数据、分析,写入hdfs,从hdfs中读取数据写入Hbase,协处理器和二级索引

    1. Hbase高级应用 1.1建表高级属性 下面几个shell 命令在hbase操作中可以起到很到的作用,且主要体现在建表的过程中,看下面几个create 属性 1. BLOOMFILTER 默认是 ...

  6. 18_clickhouse副本同步与高可用功能验证,分布式表与集群配置,数据副本与复制表,ZooKeeper整合,创建复制表,副本同步机制,数据原子写入与去重,负载平衡策略,案例(学习笔记)

    24.副本同步与高可用功能验证 24.1.分布式表与集群配置 24.2.数据副本与复制表 24.3.ZooKeeper整合 24.4.创建复制表 24.5.副本同步机制 24.6.数据原子写入与去重 ...

  7. 献给入门小白的MySQL学习笔记+案例

    MySQL学习笔记 目录 MySQL学习笔记 1.SQL概述 1.1:数据库的好处 1.2:数据库管理系统 1.3:SQL语言概述 1.4:SQL语言的分类 2.安装与使用 2.1:MySql数据库产 ...

  8. MySQL数据库学习笔记,知识点和案例整理,期末三天复习完【简单且详细】

    MySQL数据库近三万字学习笔记,超级详细! 文章目录 前言 一.day1 二.day2 三.day3 前言 MySQL数据库知识点和案例总结,非常详细,将近三万字!分成了三天去消化吸收! 一.day ...

  9. 学习笔记:SpringCloud 微服务技术栈_实用篇②_黑马旅游案例

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 前言 学习视频链接 SpringCloud + RabbitMQ + Docker + Redis + 搜 ...

最新文章

  1. 使用MLX90640自制红外热像仪(一):MLX90640介绍与API库移植
  2. [NOIP模拟测试3] 建造游乐园 题解(欧拉图性质)
  3. 如何查看某oracle实例下面定义了多少jobs
  4. 特定于数据中心的人工智能完成任务的速度可以提高两倍
  5. 计算机辅助教学( ),27075 计算机辅助教学
  6. html日历显示不完整,求html代码,显示日历和时间的代码
  7. java ab工具_(ab)使用Java 8 FunctionalInterfaces作为本地方法
  8. (七)nodejs循序渐进-模块系统(进阶篇)
  9. Idea的一些调试技巧及设置todo
  10. c语言用于提示的指令,C语言指令、符号表.doc
  11. python输出被五整除的数_python中给定一系列正整数能被5整除的数字中所有偶数的和?...
  12. 心有所鼠,鼠年快乐~
  13. 《第一行代码》第三版之我的第一行Android代码(一)
  14. JSONP原理以及示例
  15. html把圆形分成10份,CSS八等分圆的实现示例
  16. [人工智能-综述-10]:模型评估 - 常见的模型评估指标与方法大全、汇总
  17. 第一次使用公有云需要注意啥
  18. 精简指令集(RISC)和复杂指令集(CISC)的区别
  19. 华为“美腿9”手机给我的惊艳!
  20. codewhy_vue笔记01

热门文章

  1. c语言标准io中可读可写,C语言标准IO: [先读再feof] VS [先feof再读]
  2. 《机器学习实战》第九章
  3. wxWidgets:wxSimpleHtmlListBox类用法
  4. boost::spirit模块实现利用 Karma 生成器的替代方案和内置匹配功能的测试程序
  5. boost::process::posix相关的测试程序
  6. boost::multi_array模块实现在矩阵上测试切片
  7. boost::mp11::mp_product相关用法的测试程序
  8. boost::multiprecision::float128用法的测试程序
  9. boost::local_time模块custom_time_zone 和 posix_time_zone 的简单示例
  10. boost::gregorian模块实现查找给定月份最后一天的测试程序