前言
插件及服务器版本
服务器:ubuntu 16.04
ClickHouse:20.12.5
ClickHouse作为大数据场景下的高性能分析型数据库,本身是没有支持文件行级别的更新和删除的功能的。但是某些场景下还是需要更新或删除老数据的,于是便有了以增代删,即将修改和删除操作转换成新增操作。
VersionedCollapsingMergeTree(折叠合并树)就是一种通过以增代删的思路,支持行级数据删除和修改的表引擎。它通过定义一个sign标记字段,记录数据行的状态,如果sign标记为1,则表示这是一行有效的数据,如果标记为-1,则表示这行数据需要被删除,在进行分区合并时,标记为1和标记为-1的一组数据会被抵消删除。
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的数据!
在正常的数据库的CDC模式下,update、delete的操作都会带上数据更新或删除前的记录信息,如果想在ClickHouse里完成对应的update、delete的操作,只需要把更新或删除前的记录行带上sign为-1写进数据库即可,最新状态的数据带上sign为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;
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://gaokaiyang.blog.csdn.net/article/details/112501159
内容来源于网络,如有侵权,请联系作者删除!