下面是個人測試例子:詳細請參考官網(特別詳細):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") ...