clickhouse的ReplacingMergeTree引擎实战

学习ReplacingMergeTree引擎,首先你得了解clickhouse的MergeTree引擎,因为ReplacingMergeTree引擎是MergeTree引擎的一个扩展版引擎,他拥有和MergeTree一样的功能,同时新增了一个删除相同主键数据的功能。
我们知道,clickhouse的MergeTree引擎,是clickhouse众多引擎中,号称性能最好的一个引擎,但他只能按照分区删除数据,所以有些场景很难满足,或者说比较麻烦,不优雅,举个实际的例子:
比如有个系统,他的数据不是实时的,比如今天的数据,明天看会比今天多,后天看会比明天多,但你需要在你的系统中定时同步他的数据到clickhouse,
这种情况用MergeTree可以勉强实现,那就是把每天相同主键的数据都保存一条,查询的时候,只取最新的一条。但这个需要写sql解决,而且一旦查询复杂,设计到数据合并等,sql就会变的很复杂,查询效率也会降低,而且每天的数据都会重复保存,数据重复太多,量太大。
所以针对这种情况,我们可以考虑用clickhouse的ReplacingMergeTree引擎,这个引擎自动帮你筛选出来最新的一条数据,并删掉之前重复的数据。类似于mongo的updateOne,先增后删。

建表:

我们新建一个表replacing_test,用ReplacingMergeTree引擎,date作为分区键,id和name作为联合主键,point可以理解为版本号。
value就是你实际业务要的值,我们用数字类型举例。

create table replacing_test (date Date, id UInt8, name String, value UInt16, point DateTime) 
ENGINE= ReplacingMergeTree(date, (id, name), 8192,point);

这个表,相同id-name的数据,最终只会留下一条,具体留下哪一条,是由不同的point决定的。

插入测试数据

看下面的代码,我们循环插入9*9=81条数据,联合主键只有id在变,name暂时只是字符串b

    public static void main(String[] args) throws SQLException {for (int i = 1;i<10;i++){for (int j = 1;j<10;j++) {int v = j+i+100;String sql = "insert into replacing_test values ('2019-12-16', "+j+", 'b',"+v+", " + System.currentTimeMillis()/1000 + ");";System.out.println(sql+"_i="+i+"_j="+j);executeSql(sql);}}}private static void executeSql(String sql) throws SQLException {ClickHouseProperties properties = new ClickHouseProperties();ClickHouseDataSource dataSource = new ClickHouseDataSource("jdbc:clickhouse://clickhouse的ip:8123/default", properties);ClickHouseConnection connection = dataSource.getConnection();ClickHouseStatement statement = connection.createStatement();boolean execute = statement.execute(sql);}    

结果

我们看到,最终数据库只有11条数据,说明大部分相同主键的数据都被删除了,但还是有两条数据是重复的,分别是id为8和9的。
这个就是官网所说的,他的这个删除重复数据,并不是一插入就删的,而且在Merge的时候才会删,原话是:
数据的去重只会在合并的过程中出现。合并会在未知的时间在后台进行,因此你无法预先作出计划。
所以说,这个引擎是一个类似于最终一致性的机制,估计是为了性能,把删除的逻辑做成了异步。
在这里插入图片描述

解决重复:

其实这种也是可以解决的,如果不是很在意性能的话,可以手动执行一个sql去触发他的Merge就好了,sql如下:

optimize table replacing_test;

执行完再看结果,这个就对了。每个id-name为主键的数据只有最后一条。
在这里插入图片描述

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

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

相关文章

clickhouse 分片

我们知道mysql数据库如果想做分片&#xff0c;需要使用第三方组件&#xff0c;这是因为mysql在设计之初就没有太多考虑分布式等问题。而clickhouse作为新生代性能之王&#xff0c;分片也是必须的功能。基本上从2015年之后的各种数据库也罢&#xff0c;框架也罢&#xff0c;都开…

[记录] ---阿里云java.io.IOException: Connection reset by peer的问题

项目部署到阿里云&#xff0c;突然报错&#xff0c;频繁的打印堆栈信息&#xff0c;一开始是把堆内存打满导致服务一直重启&#xff0c;调大堆内存后就不影响正常服务了&#xff0c;但还是一直打堆栈&#xff0c;虽说日志会自动清理&#xff0c;但一直打这个信息着实不好看。 最…

数据库缓存双写一致性的一些个人想法

数据库缓存双写一致性的一些个人想法 有这么个问题&#xff0c;还是经典面试题&#xff1a; 说我们有个数据库&#xff0c;他的读请求特别多&#xff0c;以至于要在数据库上加一层缓存来抗压&#xff0c;这个都能理解吧。 这里的缓存&#xff0c;可能是和数据库一样的数据&am…

2020年规划

1.去其他城市&#xff0c;市级城市超过3个。 2.继续想着通过其他方式赚钱。 3.选一个技术体系&#xff0c;搞精通&#xff0c;比如数据库&#xff0c;比如高并发分布式等 4.搞个自己的网站&#xff0c;国庆前平均每天100访问量。 5.12点前睡觉 2020年1月5日&#xff0c;2020年…

实用的java代码生成器,开箱即用(基于mybatisplus的AutoGenerator)

spring-boot工程下&#xff0c;自动生成代码&#xff0c;controller层&#xff0c;service层&#xff0c;mapper层。 根据数据库配置好的表&#xff0c;逆向生成实体类和各层结构 1、引入maven <dependency><groupId>com.baomidou</groupId><artifactId&…

mac/windows 端口占用解决记录

idea启动报错&#xff1a;端口占用 The port may already be in use or the connector may be misconfigured mac端口占用解决 zhangshuaideMacBook-Pro:~ zhangshuai$ lsof -i:8095 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME Google 375 zhangshuai 32u IPv6 0x…

[配置中心] --- consul

mac下载安装consul 1、下载&#xff1a;consul下载地址 2、解压到目录/usr/local/bin下 3、执行consul文件 4、验证&#xff1a;控制台输入consul验证 5、启动consul&#xff1a;consul agent -dev windows安装consul 1、下载&#xff0c;解压到D:\soft&#xff0c;将这个路…

[java基础] --- java开发,service层是不是一定要写接口

估计很多java开发的同学都遇到过&#xff0c;service层要写一个接口&#xff0c;然后再写接口的实现类&#xff0c;但这个接口从项目开始到项目倒闭&#xff0c;都不会有第二个实现&#xff0c;那为什么不直接写个service类呢&#xff1f;如果你还没想过这个问题&#xff0c;那…

浅谈权限(功能权限数据权限)

一般企业上的权限部分&#xff0c;都是区分为功能权限和数据权限。 一、功能权限 功能权限&#xff0c;就是用户登录后&#xff0c;能看到哪些菜单&#xff0c;能看到哪些按钮&#xff0c;能执行哪些操作的权限。 一般&#xff0c;功能权限&#xff0c;已经都有很成熟的业内方…

一个技术负责人应该知道的规范细节

前言&#xff1a; 作为一个技术负责人&#xff0c;不能只定义一个项目的技术选型&#xff0c;而不注意开发细节。 开发前&#xff0c;如果不预先定义好规范&#xff0c;那么项目中就会乱成一锅粥。每个人自成一派&#xff0c;单看每个人的模块&#xff0c;貌似都没啥大问题&am…

skywalking(1) 基于opentracing规范的APM系统

skywalking是&#xff1a; 基于opentracing规范的APM系统 skywalking解决了什么问题&#xff1f; skywalking解决微服务架构下&#xff0c;多服务直接复杂的调用关系 了解dapper&#xff0c;分布式链路追踪系统 dapper又是谷歌论文&#xff0c;各公司又相继模仿。&#xff…

skywalking(2)

安装 1、安装jdk 2、安装es 3、安装skywalking&#xff08;backend和ui&#xff09; 应用启动时添加探针&#xff08;agent&#xff09; 使用 java -javaagent:/aa/bb/boot.jar -Dserver.port8081 -jar boot.jar 启动项目jar包 查看调用链&#xff0c;追踪等 仪表盘&#…

skywalking(3)

javaagent原理 skywalking实现代码无侵入&#xff0c;就是用了javaagent javaagent是java命令的一个参数&#xff0c;可以用于指定一个jar包 这个jar包中的MANIFEST.MF中&#xff0c;必须指定Premain-Class项 Premain-Class指定的那个类&#xff0c;必须实现premain()方法 当…

skywalking(4)

Byte Buddy库 统计方法调用时长 1、增强字节码 2、拦截器拦截 类似于spring的aop&#xff0c;只不过skywalking不能用aop&#xff0c;所以用Byte Buddy技术代替 Open Trace 整个trace调用&#xff0c;是由多个span组成的有向无环图&#xff08;就是调用关系图&#xff09;。…

kubernetes(k8s)

应用部署演进过程 我们从上图可以看到&#xff0c;应用越来越看重应用本身了&#xff0c;慢慢的不受物理机的差异&#xff0c;不受操作系统的差异&#xff0c;开发者可以花更多精力去到应用本身。 k8s概念 简单理解&#xff0c;k8s就是传统的云平台上的linux。 kubernetes是…

jenkins+k8s实现持续集成

持续集成&#xff08;CI&#xff09; 集成是指开发人员将代码提交到git或svn 持续集成是指让开发人员持续提交代码&#xff0c;写一点就提交一点&#xff0c;这样就会更早的发现代码差异 每次集成&#xff0c;都可以通过自动化的构建来验证 自动化构建包括&#xff1a;编译&am…

为什么要用Elasticsearch

概念 Elasticsearch 简称ES&#xff0c;是一个分布式全文检索引擎。 比如github的代码检索就是用了ES&#xff0c;百度也有用ES。 由于Lucene的api相对比较复杂&#xff0c;所以ES其实是对Lucene的封装简化&#xff0c;并且提供了一套比较简单的api文档。 es官网 使用场景 主…

[设计模式] ------ 建造者模式(对比模板模式)

建造者模式 建造者模式&#xff0c;是为了构建一类具有相同执行顺序的但实现不一样&#xff0c;最后产生不一样的东西的效果。 举个例子&#xff0c;比如写作文。 每次写作文&#xff0c;我们大致有写标题&#xff0c;写开头&#xff0c;写内容&#xff0c;写结尾这些步骤。…

[设计模式] ------ 观察者模式和他的升级版发布订阅模式

概念 观察者模式&#xff0c;原理很简单&#xff0c;把A类的子类分别注入到B类中&#xff0c;通过用B类调用方法&#xff0c;循环调用A类的方法&#xff0c;就是所谓观察者模式 伪代码如下&#xff0c;最快的速度理解观察者模式&#xff1a; 接口 A{// 观察者接口notify(); …

[设计模式] ------ 工厂方法模式

工厂方法模式 手机厂造手机&#xff0c;肥皂厂造肥皂&#xff0c;药品厂造药品。 假设有一大类对象A1,A2,A3,A4…他们都有一个共同的父类A A1可以想成是手机&#xff0c;A2可以想成肥皂… &#xff08;下面例子的A1Factory就是手机厂&#xff0c;A2Factory就是肥皂厂&#x…