下面是个人测试例子:详细请参考官网(特别详细):http://doris.incubator.apache.org/master/zh-CN/administrator-guide/dynamic-partition.html#%E7%A4%BA%E4%BE%8B
PARTITIONS 分区的基本操作:
官网:http://doris.incubator.apache.org/master/zh-CN/administrator-guide/alter-table/alter-table-temp-partition.html#%E8%A7%84%E5%88%99
查看分区:
SHOW TEMPORARY PARTITIONS FROM tb_user; //临时分区
SHOW PARTITIONS FROM tb_user;
添加临时分区:
ALTER TABLE tbl1 ADD TEMPORARY PARTITION tp1 VALUES LESS THAN("2020-02-01");
ALTER TABLE tbl2 ADD TEMPORARY PARTITION tp1 VALUES [("2020-01-01"), ("2020-02-01"));
ALTER TABLE tbl1 ADD TEMPORARY PARTITION tp1 VALUES LESS THAN("2020-02-01")
("in_memory" = "true", "replication_num" = "1")
DISTRIBUTED BY HASH(k1) BUCKETS 5;
删除临时分区
可以通过 ALTER TABLE DROP TEMPORARY PARTITION
语句删除一个表的临时分区:
原理
在某些使用场景下,用户会将表按照天进行分区划分,每天定时执行例行任务,这时需要使用方手动管理分区,否则可能由于使用方没有创建分区导致数据导入失败,这给使用方带来了额外的维护成本。
在实现方式上, FE会启动一个后台线程,根据fe.conf中dynamic_partition_enable 及 dynamic_partition_check_interval_seconds参数决定该线程是否启动以及该线程的调度频率。每次调度时,会在注册表中读取动态分区表的属性,并根据动态分区属性动态添加及删除分区。
建表时,可以在 PROPERTIES
中指定以下dynamic_partition
属性,表示这个表是一个动态分区表。
实例:
CREATE TABLE IF NOT EXISTS user2 ( `siteid` INT DEFAULT '10', `citycode` INT, `username` VARCHAR(32) DEFAULT '' ) ENGINE=olap PARTITION BY RANGE (`citycode`) ( PARTITION p20210605 VALUES LESS THAN ("20210606"), PARTITION p20210606 VALUES LESS THAN ("20210607"), PARTITION p20210607 VALUES LESS THAN ("20210608"), PARTITION p20210608 VALUES LESS THAN ("20210609") ) DISTRIBUTED BY HASH(siteid) BUCKETS 5 PROPERTIES( "replication_num" = "2", "storage_medium" = "SSD", "dynamic_partition.enable" = "true", "dynamic_partition.time_unit" = "DAY", "dynamic_partition.start" = "-3", "dynamic_partition.end" = "3", "dynamic_partition.prefix" = "p", "dynamic_partition.buckets" = "10" );
创建一张动态分区表,指定开启动态分区特性,以当天为2021-06-27为例,在每次调度时,会删除分区上界小于 2021-06-07 的分区,为了避免删除非动态创建的分区,动态删除分区只会删除分区名符合动态创建分区规则的分区,例如分区名为a1, 则即使分区范围在待删除的分区范围内,也不会被删除。同时在调度时会提前创建今天以及以后3天(总共4天)的分区(若分区已存在则会忽略),分区名根据指定前缀分别为p20210607 p20210608 p20210609 p20210610,每个分区的分桶数量为32。同时会删除 p20210603 的分区。
如果没有设置 dynamic_partition.start
,则不会删除历史分区。
test :
insert into user2 values(1,20210607,"sea1") insert into user2 values(2,20210608,"sea2") insert into user2 values(3,20210609,"sea3") insert into user2 values(4,202106010,"sea4") ...