ClickHouse入门:表引擎-VersionedCollapsingMergeTree

x33g5p2x  于2021-12-25 转载在 其他  
字(2.1k)|赞(0)|评价(0)|浏览(591)

前言
插件及服务器版本
服务器: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的数据!

场景举例

在正常的数据库的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数据折叠也是发生在分区合并时,只会对同分区的数据进折叠

相关文章