本文介绍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 国际许可协议 进行许可, 转载时请注明原文链接。