Categories
ClickHouse

ClickHouse ReplacingMergeTree数据更新方案

本文介绍ReplacingMergeTree引擎在分布式场景下的数据更新方式。

一、实验环境构建

本地表:数据按照id列进行sharding

create table woo.test_replacing_local on cluster ZYX_CK_TS_02 (create_time date, id UInt16, comment String, version UInt32) ENGINE = ReplicatedReplacingMergeTree(‘/clickhouse/ZYX_CK_TS_02/jdob_ha/woo/test_replacing_local/{shard}’, ‘{replica}’, version) PARTITION BY toYYYYMMDD(create_time) ORDER BY (id);

分布式表:

CREATE TABLE woo.test_replacing on cluster ZYX_CK_TS_02 as woo.test_replacing_local engine=Distributed(ZYX_CK_TS_02, woo, test_replacing_local, rand()) ;

shard 1插入数据:

insert into woo.test_replacing_local values(‘2019-12-12’, 0, ‘0’, 0);
insert into woo.test_replacing_local values(‘2019-12-12’, 0, ‘1’, 1);
insert into woo.test_replacing_local values(‘2019-12-13’, 0, ‘0’, 0);

shard 2插入数据:

insert into woo.test_replacing_local values(‘2019-12-12′, 0, ’10’, 10);
insert into woo.test_replacing_local values(‘2019-12-12′, 0, ’11’, 11);
insert into woo.test_replacing_local values(‘2019-12-13′, 0, ’10’, 10);

二、实验流程

1.直接查询shard 1的本地表

select * from woo.test_replacing_local;

SELECT *
FROM woo.test_replacing_local

┌─create_time─┬─id─┬─comment─┬─version─┐
│ 2019-12-13 │ 0 │ 0 │ 0 │
└─────────────┴────┴─────────┴─────────┘
┌─create_time─┬─id─┬─comment─┬─version─┐
│ 2019-12-12 │ 0 │ 0 │ 0 │
└─────────────┴────┴─────────┴─────────┘
┌─create_time─┬─id─┬─comment─┬─version─┐
│ 2019-12-12 │ 0 │ 1 │ 1 │
└─────────────┴────┴─────────┴─────────┘

结论:数据没有去重

2.直接查询分布式表

SELECT *
FROM woo.test_replacing

┌─create_time─┬─id─┬─comment─┬─version─┐
│ 2019-12-13 │ 0 │ 0 │ 0 │
└─────────────┴────┴─────────┴─────────┘
┌─create_time─┬─id─┬─comment─┬─version─┐
│ 2019-12-12 │ 0 │ 1 │ 1 │
└─────────────┴────┴─────────┴─────────┘
┌─create_time─┬─id─┬─comment─┬─version─┐
│ 2019-12-12 │ 0 │ 0 │ 0 │
└─────────────┴────┴─────────┴─────────┘
┌─create_time─┬─id─┬─comment─┬─version─┐
│ 2019-12-13 │ 0 │ 10 │ 10 │
└─────────────┴────┴─────────┴─────────┘
┌─create_time─┬─id─┬─comment─┬─version─┐
│ 2019-12-12 │ 0 │ 10 │ 10 │
└─────────────┴────┴─────────┴─────────┘
┌─create_time─┬─id─┬─comment─┬─version─┐
│ 2019-12-12 │ 0 │ 11 │ 11 │
└─────────────┴────┴─────────┴─────────┘

结论:数据没有去重

3.final方式 数据去重

查询shard 1的本地表:

SELECT *
FROM woo.test_replacing_local
FINAL

┌─create_time─┬─id─┬─comment─┬─version─┐
│ 2019-12-12 │ 0 │ 1 │ 1 │
└─────────────┴────┴─────────┴─────────┘

结论:final方式去重可以在多分区间去重

查询分布式表:

SELECT *
FROM woo.test_replacing
FINAL

┌─create_time─┬─id─┬─comment─┬─version─┐
│ 2019-12-12 │ 0 │ 1 │ 1 │
└─────────────┴────┴─────────┴─────────┘
┌─create_time─┬─id─┬─comment─┬─version─┐
│ 2019-12-12 │ 0 │ 11 │ 11 │
└─────────────┴────┴─────────┴─────────┘

结论:final方式去重可以在多节点间不能去重

4.optimize方式 数据去重

optimize table woo.test_replacing_local final;

SELECT *
FROM woo.test_replacing_local

┌─create_time─┬─id─┬─comment─┬─version─┐
│ 2019-12-13 │ 0 │ 0 │ 0 │
└─────────────┴────┴─────────┴─────────┘
┌─create_time─┬─id─┬─comment─┬─version─┐
│ 2019-12-12 │ 0 │ 1 │ 1 │
└─────────────┴────┴─────────┴─────────┘

结论:optimize 方式去重在多分区间不能去重

5.optimize+ final 方式 数据去重

SELECT *
FROM woo.test_replacing_local final

┌─create_time─┬─id─┬─comment─┬─version─┐
│ 2019-12-12 │ 0 │ 1 │ 1 │
└─────────────┴────┴─────────┴─────────┘

结论:optimize+ final 方式去重可以在多分区间去重

6. argMax方式去重

SELECT
id,
argMax(comment, version)
FROM woo.test_replacing
GROUP BY id

┌─id─┬─argMax(comment, version)─┐
│ 0 │ 11 │
└────┴──────────────────────────┘

结论:argMax方式可以在多节点间去重

三、结论

1.ReplacingMergeTree引擎的数据更新方式有三种:final、optimize、argMax

2.Optimize只能在分区范围内去重

3.final只能在本地表范围内去重

4.argMax可以在分布式表范围内去重

Leave a Reply

Your email address will not be published. Required fields are marked *