ClickHouse入门:表引擎-ReplacingMergeTree

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

前言
插件及服务器版本
服务器:ubuntu 16.04
ClickHouse:20.9.3.45

简介

虽然MergeTree拥有主键,但是它的主键没有唯一键的约束,这就意味着即便多行数据的主键相同,它们还是能够被正常写入。这里如果需要去重,可以使用ReplacingMergeTree,它能够在合并分区时删除重复的数据,但是只能对同一分区的数据去重,且去重依据是order by排序键

使用ReplacingMergeTree

  • 创建一张ReplacingMergeTree引擎的表
create table replace_test(
id String,
code String,
create_time DateTime
)ENGINE = ReplacingMergeTree()
PARTITION BY toYYYYMM(create_time)
ORDER BY (id,code)
PRIMARY key id;

  • 往新建的表里插几条数据
insert into replace_test values ('1','tracy','2020-12-17 21:18:00');

insert into replace_test values ('1','tracy','2020-12-17 21:19:00');

insert into replace_test values ('1','tracy','2020-12-17 21:20:00');

insert into replace_test values ('2','monica','2020-12-17 21:18:00');

insert into replace_test values ('2','monica','2020-12-17 21:19:00');

  • 执行optimize强制触发合并后,会按照id,code分组,保留分组内的最后一条
optimize table replace_test final;

这里可以看到表内数据确实做了去重

  • 接下来测试去重键是order by的排序键,还是primay key

在表里再插入一条id为1,code为tiger的记录

insert into replace_test values ('1','tiger','2020-12-17 21:18:00');

这里可以看到,去重依据是order by的排序键,即使设置了primary key

  • 接下来测试不同分区的数据能不能去重
    插入一条新的id为1、code为tracy、分区不同的数据
insert into replace_test values ('1','tracy','2020-11-17 21:18:00');

这里可以看到,不同分区的数据是不同去重的

  • ReplacingMergeTree引擎的版本号用法
    创建一张带版本号的ReplacingMergeTree引擎的表,以create_time为版本号
create table replace_test_version(
id String,
code String,
create_time DateTime
)ENGINE = ReplacingMergeTree(create_time)
PARTITION BY toYYYYMM(create_time)
ORDER BY (id,code);

  • 按时间乱序插入几条数据,然后去重,看一下是不是按时间顺序去重,保留最新时间的数据
insert into replace_test_version values ('1','tracy','2020-11-17 21:18:00');

insert into replace_test_version values ('1','tracy','2020-12-17 21:20:00');

insert into replace_test_version values ('1','tracy','2020-12-17 21:19:00');

这里可以看到,去重保留日期最新的一条

总结

  • 去重依据是order by排序键
  • 只有合并分区的时候才会触发去重
  • 去重只会对同一分区的数据去重
  • 去重有两种,一种是不加版本号,另一种是加版本号
    1、不加版本号的去重,则保留同一分区排序后的最后一行数据
    2、加版本号的去重,则保留版本号最大的那一条

相关文章