clickhouse的分区

说明:
clickhouse的分区和hive表有类似地方,但也有区别,比如clickhouse中支持对分区的卸载和装载,卸载的数据不受ck管控,数据一直在,还可以复制分区数据到另外一张表结构一样的分区一样的表中,他直接提供命令,hive虽然也能实现,但相对麻烦一些,同时ck还能将分区的数据进行重置,如果设置默认值,分区中数据都是默认值,注意,主键列和分区字段是不能重置,如果重置主键数据都找不到,充值了分区字段,那分区都乱了
简介:
目前只有MergeTree系列的表引擎支持数据分区。相信你对分区表已经有所认识,因为在前面的知识中已将讲解到了分区表的基本语法,这里不再过多的解释
创建分区表:
create table log(
id String ,
ctime DateTime
)engine=MergeTree()
partition by toYYYYMM(ctime)
order by (id) ;
4.3.2.1 查看分区信息
ClickHouse内置了许多system系统表,用于查询自身的状态信息。 其中parts系统表专门用于查询数据表的分区信息。
SHOW TABLES FROM system ;

SELECT
name,
partition,
table
FROM system.parts
WHERE table = ‘log’

4.3.2.2 删除分区
合理地设计分区键并利用分区的删除功能,就能够达到数据更新的目的。
ALTER TABLE tb_name DROP PARTITION partition_expr ;
alter table log drop partition ‘202106’ ; – 会将指定分区分区删除, 并且分区中数据也会被删除
– 我们的操作是删除指定分区, 然后再导入这个分区的数据 ,从而达到分区数据更新的目录!
4.3.2.3 复制分区
clickHouse支持将A表的分区数据复制到B表,这项特性可以用于快速数据写入、多表间数据同步和备份等场景,它的完整语法如下:
ALTER TABLE B REPLACE PARTITION partition_expr FROM A;
不过需要注意的是,并不是任意数据表之间都能够相互复制,它们还需要满足两个前提条件:
两张表需要拥有相同的分区键;
它们的表结构完全相同。
演示分区数据复制:
创建两张分区表 , 表的分区字段一致 , 表的分区一致
create table log1( id String , ctime DateTime )engine=MergeTree() partition by toYYYYMM(ctime) order by id ;
create table log2( id String , ctime DateTime )engine=MergeTree() partition by toYYYYMM(ctime) order by id ;
insert into log1 values(1,‘2020-12-21 00:00:00’),(2,‘2020-12-22 00:00:00’),(3,‘2020-12-23 00:00:00’),(4,‘2020-11-21 00:00:00’)
alter table log2 replace partition 202011 from log1 ;
4.3.2.4 重置分区数据
如果数据表某一列的数据有误,需要将其重置为初始值,如果设置了默认值那么就是默认值数据,如果没有设置默认值,系统会给出默认的初始值,此时可以使用下面的语句实现:
ALTER TABLE tb_name CLEAR COLUMN column_name IN PARTITION partition_expr
Alter table log2 claer column id in partition 202011 ; --注意的是不能重置主键和分区字段
Received exception from server (version 20.8.3):
Code: 524. DB::Exception: Received from localhost:9000. DB::Exception: Trying to ALTER DROP key id column which is a part of key expression.
4.3.2.5 卸载和装载分区
表分区可以通过DETACH语句卸载,分区被卸载后,它的物理数据并没有删除,而是被转移到了当前数据表目录的detached子目录下。而装载分区则是反向操作,它能够将detached子目录下的某个分区重新装载回去。卸载与装载这一对伴生的操作,常用于分区数据的迁移和备份场景。卸载某个分区的语法如下所示:
ALTER TABLE tb_name DETACH PARTITION partition_expr
查看分区表中的数据
select * from log;

卸载202106分区中的数据
alter table log detach partition 202106;

查看磁盘中的数据结构, 202106月分区的数据被移动到了表目录下的detached目录下

记住,一旦分区被移动到了detached子目录,就代表它已经脱离了ClickHouse的管理,ClickHouse并不会主动清理这些文件。这些分区文件会一直存在,除非我们主动删除或者使用ATTACH语句重新装载它们。装载某个分区的完整语法如下所示:
ALTER TABLE tb_name ATTACH PARTITION partition_expr
alter table log attach partition 202106 ;–装载以后数据就会被加载到表下

你可能感兴趣的:(clickhouse)