ClickHouse⼊门:表引擎-VersionedCollapsingMergeTree
前⾔
插件及服务器版本
服务器:ubuntu 16.04
ClickHouse:20.12.5
⽂章⽬录
简介
ClickHouse作为⼤数据场景下的⾼性能分析型数据库,本⾝是没有⽀持⽂件⾏级别的更新和删除的功能的。但是某些场景下还是需要更新或删除⽼数据的,于是便有了以增代删,即将修改和删除操作转换成新增操作。
VersionedCollapsingMergeTree(折叠合并树)就是⼀种通过以增代删的思路,⽀持⾏级数据删除和修改的表引擎。它通过定义⼀个sign标记字段,记录数据⾏的状态,如果sign标记为1,则表⽰这是⼀⾏有
效的数据,如果标记为-1,则表⽰这⾏数据需要被删除,在进⾏分区合并时,标记为1和标记为-1的⼀组数据会被抵消删除。
VersionedCollapsingMergeTree表引擎声明⽅式如下
ENGINE = VersionedCollapsingMergeTree(sign,ver)
ver为版本号字段,VersionedCollapsingMergeTree会将ver字段做为排序条件增加到order by的末端
例如:
create table test_collapsing (
shop_code String,
product_code String,
name String,
sign Int8,
write_date DateTime
) ENGINE = VersionedCollapsingMergeTree(sign,write_date)
PARTITION BY toYYYYMM(write_date)
ORDER BY (shop_code,product_code);
上边的表会根据shop_code,product_code,write_date对同分区的数据进⾏排序,最终数据会根据排序键shop_code,product_code 进⾏数据折叠,因此VersionedCollapsingMergeTree也是通过这种⽅式解决了CollapsingMergeTree数据乱序写⼊时的折叠问题
测试
删除
删除
插⼊数据:
insert into table test_collapsing values ('1','ccc','TRACY',1,'2021-01-11 23:00:00');
insert into table test_collapsing values ('1','ccc','TRACY',-1,'2021-01-11 23:00:00');
进⾏合并分区:
optimize table test_collapsing final;
这⾥可以看到数据已经删除!
修改
更新修改
插⼊数据:
insert into table test_collapsing values ('1','ccc','TRACY',1,'2021-01-11 23:00:00');
insert into table test_collapsing values ('1','ccc','TRACY',-1,'2021-01-11 23:00:00');
insert into table test_collapsing values ('1','ccc','Monica',-1,'2021-01-11 23:22:00');
这⾥可以看到数据已经更新到了最新的name为Monica的数据!
场景举例
ubuntu使用入门教程
在正常的数据库的CDC模式下,update、delete的操作都会带上数据更新或删除前的记录信息,如果想在ClickHouse⾥完成对应的update、delete的操作,只需要把更新或删除前的记录⾏带上sign为-1写进数据库即可,最新状态的数据带上sign为1写⼊即可
折叠数据的规则
如果sign=1⽐sign=-1的数据多⼀⾏,则保留版本号最新的的⼀⾏sign为1的数据
如果sign=-1⽐sign=1的数据多⼀⾏,则保留版本号最⽼的⼀⾏sign为-1的数据
如果sign=1和sign=1的数据⾏⼀样多,并且最后⼀⾏是sign=1,则保留版本号最⽼的sign=-1的数据和版本号最新的sign=1的数据如果sign=1和sign=1的数据⾏⼀样多,并且最后⼀⾏是sign=-1,则什么也不保留
使⽤时的注意点
VersionedCollapsingMergeTree的折叠并不是实时触发的,解决这个问题有以下两种⽅案:
1、在查询数据前进⾏分区合并
optimize table test_collapsing final;
2、改变查询⽅式
原sql:
select shop_code,product_code,sum(code) from test_collapsing group by shop_code,product_code;
修改后:
select shop_code,product_code,sum(code * sign) from test_collapsing group by shop_code,product_code having sum(sign)> 0;
VersionedCollapsingMergeTree数据折叠也是发⽣在分区合并时,只会对同分区的数据进折叠

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。