跳到主要内容
版本: 最新版本-3.5

临时分区

本文介绍如何使用临时分区功能。

您可以为已经定义了分区规则的分区表创建临时分区,并为这些临时分区定义新的数据分布策略。当您原子地覆盖分区中的数据或调整分区和分桶策略时,临时分区可以用作临时数据载体。 对于临时分区,您可以重置数据分布策略,如分区范围、bucket 数量以及副本数和存储介质等属性,以满足特定需求。

您可以在以下场景中使用临时分区功能

  • 原子覆盖操作

    如果您需要在重写分区中的数据的同时确保数据在重写过程中可以被查询,您可以首先基于原始正式分区创建一个临时分区,并将新数据加载到临时分区中。 然后,您可以使用 replace 操作原子地将原始正式分区替换为临时分区。 有关非分区表上的原子覆盖操作,请参见 ALTER TABLE - SWAP

  • 调整分区数据查询并发

    如果您需要修改分区的 bucket 数量,您可以首先创建一个与原始正式分区具有相同分区范围的临时分区,并指定新的 bucket 数量。 然后,您可以使用 INSERT INTO 命令将原始正式分区的数据加载到临时分区中。 最后,您可以使用 replace 操作原子地将原始正式分区替换为临时分区。

  • 修改分区规则

    如果您要修改分区策略,例如合并分区或将一个大分区拆分为多个较小的分区,您可以首先创建具有预期合并或拆分范围的临时分区。 然后,您可以使用 INSERT INTO 命令将原始正式分区的数据加载到临时分区中。 最后,您可以使用 replace 操作原子地将原始正式分区替换为临时分区。

创建临时分区

您可以使用 ALTER TABLE 命令一次创建一个或多个分区。

语法

创建单个临时分区

ALTER TABLE <table_name>
ADD TEMPORARY PARTITION <temporary_partition_name> VALUES [("value1"), {MAXVALUE|("value2")})]
[(partition_desc)]
[DISTRIBUTED BY HASH(<bucket_key>)];
ALTER TABLE <table_name>
ADD TEMPORARY PARTITION <temporary_partition_name> VALUES LESS THAN {MAXVALUE|(<"value">)}
[(partition_desc)]
[DISTRIBUTED BY HASH(<bucket_key>)];

一次创建多个分区

ALTER TABLE <table_name>
ADD TEMPORARY PARTITIONS START ("value1") END ("value2") EVERY {(INTERVAL <num> <time_unit>)|<num>}
[(partition_desc)]
[DISTRIBUTED BY HASH(<bucket_key>)];

参数

partition_desc:指定临时分区的 bucket 数量和属性,例如副本数和存储介质。

示例

在表 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

ALTER TABLE site_access
ADD TEMPORARY PARTITION tp3 VALUES LESS THAN ("2020-04-01")
("replication_num" = "1")
DISTRIBUTED BY HASH (site_id);

使用 START (...) END (...) EVERY (...) 语法在表 site_access 中一次创建多个分区,并将这些分区的范围指定为 [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 [db_name.]table_name [WHERE] [ORDER BY] [LIMIT]

将数据加载到临时分区

您可以使用 INSERT INTO 命令、STREAM LOAD 或 BROKER LOAD 将数据加载到一个或多个临时分区中。

使用 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,...);

有关详细的语法和参数描述,请参见 INSERT INTO

使用 STREAM LOAD 加载数据

示例

curl --location-trusted -u root: -H "label:123" -H "Expect:100-continue" -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.label1
(
DATA INFILE("hdfs://hdfs_host:hdfs_port/user/starrocks/data/input/file")
INTO TABLE my_table
TEMPORARY PARTITION (tp1, tp2, ...)
...
)
WITH BROKER
(
StorageCredentialParams
);

请注意,StorageCredentialParams 表示一组身份验证参数,这些参数因您选择的身份验证方法而异。 有关详细的语法和参数描述,请参见 Broker Load

使用 ROUTINE LOAD 加载数据

示例

CREATE ROUTINE LOAD example_db.site_access ON example_tbl
COLUMNS(col, col2,...),
TEMPORARY PARTITIONS(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 语句查询指定临时分区中的数据。

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, ...);

您可以使用 JOIN 子句查询来自两个表的临时分区中的数据。

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;

将原始正式分区替换为临时分区

您可以使用 ALTER TABLE 语句将原始正式分区替换为临时分区,从而创建一个新的正式分区。

注意

您在 ALTER TABLE 语句中操作的原始正式分区和临时分区将被删除且无法恢复。

语法

ALTER TABLE table_name REPLACE PARTITION (partition_name) WITH TEMPORARY PARTITION (temporary_partition_name1, ...)
PROPERTIES ("key" = "value");

参数

  • strict_range

    默认值:true

    当此参数设置为 true 时,所有原始正式分区的范围的并集必须与用于替换的临时分区的范围的并集完全相同。 当此参数设置为 false 时,您只需要确保替换后新正式分区的范围不与其他正式分区重叠。

    • 示例 1

      在以下示例中,原始正式分区 p1p2p3 的并集与临时分区 tp1tp2 的并集相同,您可以使用 tp1tp2 替换 p1p2p3

      # Ranges of original formal partitions p1, p2, and p3 => Unions of these ranges
      [10, 20), [20, 30), [40, 50) => [10, 30), [40, 50)

      # Ranges of temporary partitions tp1 and tp2 => Unions of these ranges
      [10, 30), [40, 45), [45, 50) => [10, 30), [40, 50)
    • 示例 2

      在以下示例中,原始正式分区的范围的并集与临时分区的范围的并集不同。 如果参数 strict_range 的值设置为 true,则临时分区 tp1tp2 不能替换原始正式分区 p1。 如果该值设置为 false,并且临时分区的范围 [10, 30) 和 [40, 50) 不与其他正式分区重叠,则临时分区可以替换原始正式分区。

      # Range of original formal partition p1 => Union of the range
      [10, 50) => [10, 50)

      # Ranges of temporary partitions tp1 and tp2 => Unions of these ranges
      [10, 30), [40, 50) => [10, 30), [40, 50)
  • use_temp_partition_name

    默认值:false

    如果要替换的原始正式分区的数量与用于替换的临时分区的数量相同,则当此参数设置为 false 时,新正式分区的名称在替换后保持不变。 当此参数设置为 true 时,临时分区的名称将用作替换后新正式分区的名称。

    在以下示例中,当此参数设置为 false 时,新正式分区的分区名称在替换后仍为 p1。 但是,其相关数据和属性将替换为临时分区 tp1 的数据和属性。 当此参数设置为 true 时,新正式分区的分区名称在替换后更改为 tp1。 原始正式分区 p1 不再存在。

    ALTER TABLE tbl1 REPLACE PARTITION (p1) WITH TEMPORARY PARTITION (tp1);

    如果要替换的正式分区的数量与用于替换的临时分区的数量不同,并且此参数保持默认值 false,则此参数的 false 值无效。

    在以下示例中,替换后,新正式分区的名称更改为 tp1,原始正式分区 p1p2 不再存在。

    ALTER TABLE site_access REPLACE PARTITION (p1, p2) WITH TEMPORARY PARTITION (tp1);

示例

将原始正式分区 p1 替换为临时分区 tp1

ALTER TABLE site_access REPLACE PARTITION (p1) WITH TEMPORARY PARTITION (tp1);

将原始正式分区 p2p3 替换为临时分区 tp2tp3

ALTER TABLE site_access REPLACE PARTITION (p2, p3) WITH TEMPORARY PARTITION (tp2, tp3);

将原始正式分区 p4p5 替换为临时分区 tp4tp5,并将参数 strict_range 指定为 false,将 use_temp_partition_name 指定为 true

ALTER TABLE site_access REPLACE PARTITION (p4, p5) WITH TEMPORARY PARTITION (tp4, tp5)
PROPERTIES (
"strict_range" = "false",
"use_temp_partition_name" = "true"
);

使用说明

  • 当表具有临时分区时,您不能使用 ALTER 命令对表执行 Schema Change 操作。
  • 在对表执行 Schema Change 操作时,您不能向该表添加临时分区。

删除临时分区

使用以下命令删除临时分区 tp1

ALTER TABLE site_access DROP TEMPORARY PARTITION tp1;

请注意以下限制

  • 如果您使用 DROP 命令直接删除数据库或表,您可以在有限的时间内使用 RECOVER 命令恢复数据库或表。 但是,临时分区无法恢复。
  • 使用 ALTER 命令删除正式分区后,您可以在有限的时间内使用 RECOVER 命令恢复它。 临时分区不与正式分区绑定,因此对临时分区的操作不会影响正式分区。
  • 使用 ALTER 命令删除临时分区后,您无法使用 RECOVER 命令恢复它。
  • 当使用 TRUNCATE 命令删除表中的数据时,表的临时分区将被删除且无法恢复。
  • 当使用 TRUNCATE 命令删除正式分区中的数据时,临时分区不会受到影响。
  • TRUNCATE 命令不能用于删除临时分区中的数据。