当前位置: 首页 > news >正文

Clickhouse学习笔记(11)—— 数据一致性

使用合并树引擎时,无论是ReplacingMergeTree还是SummingMergeTree,都只能保证数据的最终一致性,因为数据的去重、聚合等操作会在数据合并的期间进行,而合并会在后台以一个不确定的时间进行,因此无法预先计划;

数据准备

建表:

CREATE TABLE test_consistence(user_id UInt64,score String,deleted UInt8 DEFAULT 0,create_time DateTime DEFAULT toDateTime(0)
)ENGINE= ReplacingMergeTree(create_time)
ORDER BY user_id;

其中deleted作为是否删除的标识;create_time 是版本号字段,每组数据中 create_time 最大的一行表示最新的数据

导入数据:

INSERT INTO TABLE test_consistence(user_id,score)
WITH(SELECT ['A','B','C','D','E','F','G']
)AS dict
SELECT number AS user_id, dict[number%7+1] FROM numbers(10000000);

数据结构如下:

通过修改create_time的值,可以更新数据:

INSERT INTO TABLE test_consistence(user_id,score,create_time)
WITH(SELECT ['AA','BB','CC','DD','EE','FF','GG']
)AS dict
SELECT number AS user_id, dict[number%7+1], now() AS create_time FROM 
numbers(500000);

now()函数可以获取当前时间

查询发现,此时表中共有10500000条数据,说明还未进行去重;

去重方案

手动 OPTIMIZE

在写入数据后,立刻执行 OPTIMIZE 强制触发新写入分区的合并动作

optimize table test_consistence;

耗费时间:

可以看到,optimize是一个相对比较耗时的操作(与select、insert相比),因为需要进行大量的数据读写

通过 Group by 去重

执行去重的查询

SELECTuser_id ,argMax(score, create_time) AS score, argMax(deleted, create_time) AS deleted,max(create_time) AS ctime 
FROM test_consistence 
GROUP BY user_id
HAVING deleted = 0;

函数argMaxargMax(field1,field2):按照 field2 的最大值取 field1 的值

因此argMax(score, create_time)的含义就是,按照create_time的最大值取score的值,因为create_time代表当前数据的更新时间,因此总能取到最新的数据;

同理argMax(deleted, create_time)是取最新的deleted标识,来判断数据是否被删除

创建视图

通过上面的操作我们可以实现数据的去重等操作,从而保证一致性,因此创建视图来保存数据查询的逻辑

CREATE VIEW view_test_consistence AS
SELECTuser_id ,argMax(score, create_time) AS score, argMax(deleted, create_time) AS deleted,max(create_time) AS ctime 
FROM test_consistence 
GROUP BY user_id
HAVING deleted = 0;

视图创建的格式:create view view_name as select......

注意:这里创建的视图仅仅保存了数据查询的逻辑,并不保存具体的数据;

测试去重效果

插入数据:

insert into test_consistence(user_id, score, create_time) values(0, 'AAAA', now());

然后查询数据:

select * from test_consistence where user_id = '0';

发现并未去重;

而从视图中查询:

select * from view_test_consistence where user_id = '0';

则仅有最新的数据:

通过 FINAL 查询

在查询语句后增加 FINAL 修饰符,这样在查询的过程中将会执行 Merge 的特殊逻辑(例如数据去重,预聚合等)

测试

① 不使用final查询:

select * from visits_v1 WHERE StartDate = '2014-03-17' limit 100;

②使用final查询:

select * from visits_v1 final WHERE StartDate = '2014-03-17' limit 100;

可以看到,查询速度并没有普通的查询快,因此使用final确保数据一致性也是以效率为代价的;

版本说明

早期版本增加 FINAL 之后,查询会变成单线程;但从v20.5.2.7-stable版本之后转为多线程执行,并可以通过max_final_threads 参数控制单个查询的线程数:

explain pipeline select * from visits_v1 final WHERE StartDate = '2014-03-17' limit 100;

可以看到从 CollapsingSortedTransform 这一步开始已经是多线程执行,但是读取 part 部分的动作还是串行

相关文章:

  • ELK分布式日志
  • TypeScript: 判断两个数组的内容是否相等
  • 解决游戏找不到x3daudio1_7.dll文件的5个方法,快速修复dll问题
  • Ubuntu 20.04编译Chrome浏览器
  • 『MySQL快速上手』-⑤-数据类型
  • 使用微信小程序控制蓝牙小车(微信小程序端)
  • U盘插在电脑上显示要格式化磁盘怎么办
  • 华为开源carbondata中的使用问题处理
  • gma 2.0.3 (2023.11.12) 更新日志
  • 谷歌插件报错 Manifest version 2 is deprecated, and support will be removed in 2023.
  • 手写C++ 实现链表的反转、删除、合并
  • 和数链“分布式存储”技术结合隐私计算让数据更安全
  • 【龙芯固件】ACPI——简介
  • Java必刷入门递归题×5(内附详细递归解析图)
  • 125. 验证回文串(力扣oj)
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • export和import的用法总结
  • express如何解决request entity too large问题
  • Java的Interrupt与线程中断
  • Linux各目录及每个目录的详细介绍
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • PAT A1120
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • 初识 beanstalkd
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 开源地图数据可视化库——mapnik
  • 如何解决微信端直接跳WAP端
  • 小程序 setData 学问多
  • 小程序开发之路(一)
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​ssh免密码登录设置及问题总结
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (003)SlickEdit Unity的补全
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (2020)Java后端开发----(面试题和笔试题)
  • (C++17) optional的使用
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (ZT)薛涌:谈贫说富
  • (编译到47%失败)to be deleted
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)计算机毕业设计高校学生选课系统
  • (汇总)os模块以及shutil模块对文件的操作
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .“空心村”成因分析及解决对策122344
  • .net core 连接数据库,通过数据库生成Modell
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 材料检测系统崩溃分析
  • .net 使用ajax控件后如何调用前端脚本
  • .Net中间语言BeforeFieldInit