分类
Articles

ClickHouse内幕(7)使用ReplacingMergeTree 进行去重

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

本文介绍ReplacingMergeTree引擎在分布式场景下的数据去重使用方式。

一、实验环境构建

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

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

分布式表:

CREATE TABLE woo.test_replacing on cluster jacky as woo.test_replacing_local 
engine=Distributed(jacky, 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可以在分布式表范围内去重

本作品采用 知识共享署名 4.0 国际许可协议 进行许可, 转载时请注明原文链接。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注