临时分区
本文介绍如何使用临时分区功能。
您可以在一张已经定义分区规则的分区表上,创建临时分区,并为这些临时分区设定单独的数据分布策略。在原子覆盖写操作或调整分区分桶策略时候,您可以将临时分区作为临时可用的数据载体。您可以为临时分区设定的数据分布策略包括分区范围、分桶数、以及部分属性,例如副本数、存储介质。
在以下应用场景中,您可以使用临时分区功能:
-
原子覆盖写操作
如果您需要重写某一正式分区的数据,同时保证重写过程中可以查看数据,您可以先创建一个对应的临时分区,将新的数据导入到临时分区后,通过替换操作,原子地替换原有正式分区,生成新正式分区。对于非分区表的原子覆盖写操作,请参考 ALTER TABLE - SWAP。
-
调整分区数据的查询并发
如果您需要修改某一正式分区的分桶数,您可以先创建一个对应分区范围的临时分区,并指定新的分桶数,然后通过
INSERT INTO
命令将原有正式分区的数据导入到临时分区中,通过替换操作,原子地替换原有正式分区,生成新正式分区。 -
修改分区策略
如果您希望修改正式分区的分区范围,例如合并多个小分区为一个大分区,或将一个大分区分割成多个小分区,您可以先建立对应合并或分割后范围的临时分区,然后通过
INSERT INTO
命令将原有正式分区的数据导入到临时分区中,通过替换操作,原子地替换原有正式分区, 生成新正式分区。
创建临时分区
您可以通过 ALTER TABLE 命令创建一个临时分区,也可以批量创建临时分区。
语法
创建一个临时分区
ALTER TABLE <table_name>
ADD TEMPORARY PARTITION <temporary_partition_name> VALUES [("value1"), {MAXVALUE|("value2")})]
[(partition_desc)]
[DISTRIBUTED BY HASH(<bucket_key>) BUCKETS <bucket_number>];
ALTER TABLE <table_name>
ADD TEMPORARY PARTITION <temporary_partition_name> VALUES LESS THAN {MAXVALUE|(<"value">)}
[(partition_desc)]
[DISTRIBUTED BY HASH(<bucket_key>) BUCKETS <bucket_number>];
批量创建临时分区
ALTER TABLE <table_name>
ADD TEMPORARY PARTITIONS START ("value1") END ("value2") EVERY {(INTERVAL <num> <time_unit>)|<num>}
[(partition_desc)]
[DISTRIBUTED BY HASH(<bucket_key>) BUCKETS <bucket_number>];
参数说明
partition_desc
:为临时分区指定分桶数和部分属性,包括副本数、存储介质等信息。
示例
在 site_access
表中创建临时分区 tp1
, 使用 VALUES [(...),(...))
语法指定其临时分区范围 为 [2020-01-01, 2020-02-01)。
ALTER TABLE site_access
ADD TEMPORARY PARTITION tp1 VALUES [("2020-01-01"), ("2020-02-01"));
在 site_access
表中创建临时分区 tp2
,使用 VALUES LESS THAN (...)
语法指定其临时分区的上界为 2020-03-01
。StarRocks 会将前一个临时分区的上界作为该临时分区的下界,生成一个左闭右开的临时分区,其范围为 [2020-02-01, 2020-03-01)。
ALTER TABLE site_access
ADD TEMPORARY PARTITION tp2 VALUES LESS THAN ("2020-03-01");
在 site_access
表中创建临时分区 tp3
,使用 VALUES LESS THAN (...)
语法指定其临时分区的上界为 2020-04-01
并且指定临时分区的副本数为 1
,分桶数为 5
。
ALTER TABLE site_access
ADD TEMPORARY PARTITION tp3 VALUES LESS THAN ("2020-04-01")
("replication_num" = "1")
DISTRIBUTED BY HASH (site_id) BUCKETS 5;
在 site_access
表中批量创建临时分区,使用 START (...) END (...) EVERY (...)
语法指定批量创建的临时分区范围为 [2020-04-01, 2021-01-01),分区粒度是一个月。
ALTER TABLE site_access
ADD TEMPORARY PARTITIONS START ("2020-04-01") END ("2021-01-01") EVERY (INTERVAL 1 MONTH);
注意事项
- 临时分区的分区列和原有正式分区相同,且不可修改。
- 临时分区的分区名称不能和正式分区以及其他临时分区重复。
- 一张表所有临时分区之间的分区范围不可重叠,但临时分区的范围和正式分区范围可以重叠。
查看临时分区
您可以通过如下 SHOW TEMPORARY PARTITIONS 命令,查看表的临时分区。
SHOW TEMPORARY PARTITIONS FROM site_access;
导入数据至临时分区
您可以通过 INSERT INTO
命令、STREAM LOAD、BROKER LOAD 或者 ROUTINE LOAD 方式将数据导入临时分区。
通过 INSERT INTO
命令导入
您可以通过如下 INSERT INTO 命令将数据导入临时分区。
INSERT INTO site_access TEMPORARY PARTITION (tp1) VALUES ("2020-01-01",1,"ca","lily",4);
INSERT INTO site_access TEMPORARY PARTITION (tp2) SELECT * FROM site_access_copy PARTITION p2;
INSERT INTO site_access TEMPORARY PARTITION (tp3, tp4,...) SELECT * FROM site_access_copy PARTITION (p3, p4,...);
通过 STREAM LOAD 方式导入
示例:
curl --location-trusted -u <username>:<password> -H "label:label1" -H "temporary_partitions: tp1, tp2, ..." -T testData \
http://host:port/api/example_db/site_access/_stream_load
有关语法和参数等更多信息,请参见 STREAM LOAD。
通过 BROKER LOAD 方式导入
示例:
LOAD LABEL example_db.label2
(
DATA INFILE("hdfs://hdfs_host:hdfs_port/user/starrocks/data/input/file")
INTO TABLE site_access
TEMPORARY PARTITION (tp1, tp2, ...)
...
)
WITH BROKER
(
StorageCredentialParams
);
有关语法和参数等更多信息,请参见 BROKER LOAD。
通过 ROUTINE LOAD 方式导入
示例:
CREATE ROUTINE LOAD routine_load_job ON site_access
COLUMNS (event_day,site_id,city_code,user_name,pv),
TEMPORARY PARTITION (tp1, tp2, ...)
FROM KAFKA
(
"kafka_broker_list" ="<kafka_broker1_ip>:<kafka_broker1_port>,<kafka_broker2_ip>:<kafka_broker2_port>",
"kafka_topic" = "ordertest"
);
有关语法和参数等更多信息,请参见 CREATE ROUTINE LOAD。
查询临时分区的数据
您可以查询指定临时分区的数据。
SELECT * FROM
site_access TEMPORARY PARTITION (tp1);
SELECT * FROM
site_access TEMPORARY PARTITION (tp1, tp2, ...);
SELECT event_day,site_id,pv FROM
site_access TEMPORARY PARTITION (tp1, tp2, ...);
您可以对两张表中指定临时分区的数据进行连接查询。
SELECT * FROM
site_access TEMPORARY PARTITION (tp1, tp2, ...)
JOIN
site_access_copy TEMPORARY PARTITION (tp1, tp2, ...)
ON site_access.site_id=site_access1.site_id and site_access.event_day=site_access1.event_day
;
使用临时分区进行替换
您可以通过以下命令使用临时分区替换原有正式分区,形成新正式分区。分区替换成功后,原有正式分区和临时分区被删除且不可恢复。