title: Clickhouse表引擎ReplacingMergeTree
date: 2022-03-12 10:06:45
tags: [clickhouse, olap]
categories: clickhouse
我们都知道,clickhouse不支持直接更新,而是通过merge的方式实现的,上次说了CollapsingMergeTree,它是通过主键,还有一个标识字段,进行数据的折叠,来删除老的数据,今天来说下另外一种删除老的数据的策略:替换,ReplacingMergeTree。
ReplacingMergeTree
该引擎与MergeTree的区别在于,它会删除排序键值相同的重复项。
数据的去重只会在合并期间进行。合并会在后台一个不确定的时间进行,因此你无法预先做出计划。有一些数据可能仍未被处理。尽管你可以调用OPTIMIZE
语句发起计划之外的合并,但请不要依靠它,因为OPTIMIZE
操作会引发大量的数据读写操作。
因此,ReplacingMergeTree适用于在后台清理重复数据,以节省空间。但是它不保证没有重复的数据出现。
建表
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 name=value, ...]
ReplacingMergeTree的参数
- ver - 版本列,类型为UInt*、Date、DateTime。可选参数
在数据合并的时候,ReplacingMergeTree从所有具有相同排序键的行中,选择一行留下:
a. 如果ver
列未指定,保留最后一条
b. 如果ver
列已指定,保留ver值最大的版本
实例
建表
CREATE TABLE emp_replacingmergetree
(
emp_id UInt16 COMMENT '员工id',
name String COMMENT '姓名',
work_place String COMMENT '工作地点',
age UInt8 COMMENT '员工年龄',
depart String COMMENT '部门',
salary Decimal32(2) COMMENT '薪水',
ver UInt8 comment '版本号'
) ENGINE = ReplacingMergeTree(ver)
ORDER BY (emp_id, name)
PARTITION BY work_place
;
插入相同主键的两个版本数据
INSERT INTO emp_replacingmergetree VALUES (1, 'zhangsan', 'beijing', 25, 'tech', 20000, 1);
INSERT INTO emp_replacingmergetree VALUES (1, 'zhangsan', 'beijing', 29, 'tech', 30000, 2);
查看表中数据
localhost :) select * from emp_replacingmergetree;
SELECT *
FROM emp_replacingmergetree
Query id: d8e24f75-c83d-4e57-9ee7-291c0f4b7578
┌─emp_id─┬─name─────┬─work_place─┬─age─┬─depart─┬─salary─┬─ver─┐
│ 1 │ zhangsan │ beijing │ 29 │ tech │ 30000 │ 2 │
└────────┴──────────┴────────────┴─────┴────────┴────────┴─────┘
┌─emp_id─┬─name─────┬─work_place─┬─age─┬─depart─┬─salary─┬─ver─┐
│ 1 │ zhangsan │ beijing │ 25 │ tech │ 20000 │ 1 │
└────────┴──────────┴────────────┴─────┴────────┴────────┴─────┘
2 rows in set. Elapsed: 0.005 sec.
手动合并
optimize table emp_replacingmergetree;
-- 再次执行查询
localhost :) select * from emp_replacingmergetree;
SELECT *
FROM emp_replacingmergetree
Query id: bbc56bfb-6c78-4d4c-9c04-0e60803fb397
┌─emp_id─┬─name─────┬─work_place─┬─age─┬─depart─┬─salary─┬─ver─┐
│ 1 │ zhangsan │ beijing │ 29 │ tech │ 30000 │ 2 │
└────────┴──────────┴────────────┴─────┴────────┴────────┴─────┘
1 rows in set. Elapsed: 0.003 sec.
总结
所以,ReplacingMergeTree表引擎会删除排序键重复的数据,留下版本最大的一条,实现删除和更新的操作。
而上次介绍的CollapsingMergeTree会通过数据的新增和删除标记来实现,实现数据的更新会多插入一条数据。
Keep reading, Keep writing, Keep coding.
欢迎关注我的微信公众号,比较喜欢分享知识,也喜欢宠物,所以做了这2个公众号:
喜欢宠物的朋友可以关注:【电巴克宠物Pets】
一起学习,一起进步。