乐知付加密服务平台

如果你有资源, 平台可以帮你实现内容变现, 无需搭建知识付费服务平台。

点击访问官方网站 https://lezhifu.cc

扫码关注公众号 乐知付加密服务平台-微信公众号
Clickhouse表引擎ReplacingMergeTree | chenzuoli's blog

Clickhouse表引擎ReplacingMergeTree

我们都知道,clickhouse不支持直接更新,而是通过merge的方式实现的,上次说了CollapsingMergeTree,它是通过主键,还有一个标识字段,进行数据的折叠,来删除老的数据,今天来说下另外一种删除老的数据的策略:替换,ReplacingMergeTree。

ch

ReplacingMergeTree

该引擎与MergeTree的区别在于,它会删除排序键值相同的重复项。

数据的去重只会在合并期间进行。合并会在后台一个不确定的时间进行,因此你无法预先做出计划。有一些数据可能仍未被处理。尽管你可以调用OPTIMIZE语句发起计划之外的合并,但请不要依靠它,因为OPTIMIZE操作会引发大量的数据读写操作。

因此,ReplacingMergeTree适用于在后台清理重复数据,以节省空间。但是它不保证没有重复的数据出现。

建表

1
2
3
4
5
6
7
8
9
10
11
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的参数

  1. ver - 版本列,类型为UInt*、Date、DateTime。可选参数
    在数据合并的时候,ReplacingMergeTree从所有具有相同排序键的行中,选择一行留下:
    a. 如果ver列未指定,保留最后一条
    b. 如果ver列已指定,保留ver值最大的版本

实例

建表

1
2
3
4
5
6
7
8
9
10
11
12
13
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
;

插入相同主键的两个版本数据

1
2
INSERT INTO emp_replacingmergetree VALUES (1, 'zhangsan', 'beijing', 25, 'tech', 20000, 1);
INSERT INTO emp_replacingmergetree VALUES (1, 'zhangsan', 'beijing', 29, 'tech', 30000, 2);

查看表中数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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.

手动合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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】
电巴克宠物

一起学习,一起进步。

-------------本文结束感谢您的阅读-------------