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的数据!

场景举例

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

这是一个基于 Docker Compose 的配置文件,主要用于定义和运行 ClickHouse 容器服务。下面是对这个配置文件的详细解读: ### 配置解析 1. **`version: "3.7"`** 指定当前使用的 Docker Compose 文件版本为 `3.7`。不同的版本可能会有不同的语法和支持的功能。 2. **`services:`** 定义了一组需要启动的服务,在这里有两个服务分别叫 `clickhouse01` 和 `clickhouse02`。 #### 服务一:`clickhouse01` ```yaml clickhouse01: image: yandex/clickhouse-server ``` - 使用镜像名为 `yandex/clickhouse-server` 来创建容器。 ```yaml container_name: clickhouse01 hostname: clickhouse01 ``` - 设置了容器名称为 `clickhouse01`,并且主机名也设为了 `clickhouse01`,方便在网络内识别。 ```yaml ports: - 8811:8123 - 9011:9000 ``` - 将宿主机器的端口 `8811` 映射到容器内的 `8123` 端口(通常用于 HTTP 接口);同时将宿主机器的端口 `9011` 映射到容器内的 `9000` 端口(通常是 TCP 接口)。这意味着你可以从外部通过 `localhost:8811` 或 `localhost:9011` 访问该容器提供的服务。 ```yaml volumes: - "D:/clichhouse-data/volume1:/var/lib/clickhouse" ``` - 把本地路径 `D:/clichhouse-data/volume1` 挂载到了容器内部 `/var/lib/clickhouse` 目录下,ClickHouse 默认会在这个目录存储数据。这样做的好处是可以持久化数据,即便删除容器后数据也不会丢失。 #### 服务二:`clickhouse02` 此部分与上面类似,只是更改了一些细节: - 容器和服务名字改成了 `clickhouse02`; - 映射的不同端口号分别是 `8812:8123` 和 `9012:9000`; - 数据挂载位置改为 `D:/clichhouse-data/volume2`。 --- ### 功能概述 这份 YAML 文件的核心目的是搭建两个独立运行的 ClickHouse 实例,并让它们各自拥有独立的数据存储空间以及暴露在外供客户端访问的独特端口。 通过这种方式可以轻松地在同一台物理机上模拟分布式数据库环境,比如测试集群间的同步、分片等功能。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值