v3.0 起,StarRocks 支持表达式分区(原称自动创建分区),更加灵活易用,适用于大多数场景,比如按照连续日期范围或者枚举值来查询和管理数据。
仅需要在建表时设置分区表达式(时间函数表达式或列表达式)。在数据导入时,StarRocks 会根据数据和分区表达式的定义规则自动创建分区,无需在建表时预先手动/批量创建大量分区,或者配置动态分区属性
时间函数表达式分区
按照连续日期范围来查询和管理数据,则只需要在时间函数分区表达式中,指定一个日期类型(DATE 或者 DATETIME )的分区列,以及指定分区粒度(年、月、日或小时)。StarRocks 会根据导入的数据和分区表达式,自动创建分区并且设置分区的起止时间
语法
PARTITION BY expression
...
[ PROPERTIES( 'partition_live_number' = 'xxx' ) ]
expression ::=
{ date_trunc ( <time_unit> , <partition_column> ) |
time_slice ( <partition_column> , INTERVAL <N> <time_unit> [ , boundary ] ) }
参数说明:
- expression:目前仅支持 date_trunc 和 time_slice 函数
- time_unit:分区粒度,目前仅支持为 hour、day、month 或 year
- partition_column:分区列
- partition_live_number:保留最近多少数量的分区。最近是指分区按时间的先后顺序进行排序,以当前时间为基准,然后从后往前数指定个数的分区进行保留,其余(更早的)分区会被删除
使用说明
在导入的过程中 StarRocks 根据导入数据已经自动创建了一些分区,但是由于某些原因导入作业最终失败,则在当前版本中,已经自动创建的分区并不会由于导入失败而自动删除。
StarRocks 自动创建分区数量上限默认为 4096,由 FE 配置参数 max_automatic_partition_number
决定。
分区命名规则与动态分区的命名规则一致。
示例
假设经常按天查询数据,则建表时可以使用分区表达式 date_trunc() ,并且设置分区列为 event_day ,分区粒度为 day
CREATE TABLE site_access1 (
event_day DATETIME NOT NULL,
site_id INT DEFAULT '10',
city_code VARCHAR(100),
user_name VARCHAR(32) DEFAULT '',
pv BIGINT DEFAULT '0'
)
DUPLICATE KEY(event_day, site_id, city_code, user_name)
PARTITION BY date_trunc('day', event_day)
DISTRIBUTED BY HASH(event_day, site_id);
如果希望引入分区生命周期管理,即仅保留最近一段时间的分区,删除历史分区,则可以使用 partition_live_number 设置只保留最近多少数量的分区
CREATE TABLE site_access2 (
event_day DATETIME NOT NULL,
site_id INT DEFAULT '10',
city_code VARCHAR(100),
user_name VARCHAR(32) DEFAULT '',
pv BIGINT DEFAULT '0'
)
DUPLICATE KEY(event_day, site_id, city_code, user_name)
PARTITION BY date_trunc('month', event_day)
DISTRIBUTED BY HASH(event_day, site_id)
PROPERTIES(
"partition_live_number" = "3" -- 只保留最近 3 个分区
);
假设经常按周查询数据,则建表时可以使用分区表达式 time_slice(),设置分区列为 event_day,分区粒度为七天。将一周的数据存储在一个分区中
CREATE TABLE site_access3 (
event_day DATETIME NOT NULL,
site_id INT DEFAULT '10',
city_code VARCHAR(100),
user_name VARCHAR(32) DEFAULT '',
pv BIGINT DEFAULT '0'
)
DUPLICATE KEY(event_day, site_id, city_code, user_name)
PARTITION BY time_slice(event_day, INTERVAL 7 day)
DISTRIBUTED BY HASH(event_day, site_id);
列表达式分区
如果经常按照枚举值来查询和管理数据,则您只需要指定表示类型的列为分区列,StarRocks 会根据导入的数据的分区列值,来自动划分并创建分区
语法
PARTITION BY expression
...
[ PROPERTIES( 'partition_live_number' = 'xxx' ) ]
expression ::=
( <partition_columns> )
partition_columns ::=
<column>, [ <column> [,...] ]
参数说明
- partition_columns:分区列。
- partition_live_number:保留多少数量的分区。比较这些分区包含的值,定期删除值小的分区,保留值大的。后台会定时调度任务来管理分区数量
分区命名规则:如果存在多个分区列,则不同分区列的值以下划线(_)连接。例如:存在有两个分区列 dt 和 city,均为字符串类型,导入一条数据 2022-04-01, beijing,则自动创建的分区名称为 p20220401_beijing。
举例:
假设经常按日期范围和特定城市查询机房收费明细,则建表时可以使用分区表达式指定分区列为日期 dt 和城市 city。这样属于相同日期和城市的数据分组到同一个分区中
CREATE TABLE t_recharge_detail1 (
id bigint,
user_id bigint,
recharge_money decimal(32,2),
city varchar(20) not null,
dt varchar(20) not null
)
DUPLICATE KEY(id)
PARTITION BY (dt,city)
DISTRIBUTED BY HASH(`id`);
也可以在建表时配置参数 partition_live_number 进行分区生命周期管理,例如指定该表只保留最近 3 个分区。
CREATE TABLE t_recharge_detail2 (
id bigint,
user_id bigint,
recharge_money decimal(32,2),
city varchar(20) not null,
dt varchar(20) not null
)
DUPLICATE KEY(id)
PARTITION BY (dt,city)
DISTRIBUTED BY HASH(`id`)
PROPERTIES(
"partition_live_number" = "3" -- 只保留最近 3 个分区。
);