文章目录
前言
在某些使用场景下,用户会按天对表进行分区,每天定时执行例行任务。此时,用户需要手动管理分区。否则可能会因为用户没有创建分区而导致数据导入失败,给用户带来额外的维护成本。
通过动态分区功能,用户可以在建表时设置动态分区规则。 FE 会启动一个后台线程,根据用户指定的规则创建或删除分区。用户还可以在运行时更改现有规则
动态分区是 Doris 0.12 版本中引入的一个新特性。旨在实现表级分区的生命周期管理(TTL),减轻用户负担。
目前实现了动态添加分区和动态删除分区的功能。
从0.15.0版本开始,支持列表分区和动态创建历史分区。
一、按天分区【 Range 分区】 :
-
分区列通常为时间列,以方便的管理新旧数据。Range 分区支持的列类型 DATE, DATETIME, TINYINT, SMALLINT, INT, BIGINT, LARGEINT。
-
分区信息,支持四种写法:
1、FIXED RANGE:定义分区的左闭右开区间。
PARTITION BY RANGE(col1[, col2, ...])
(
PARTITION partition_name1 VALUES [("k1-lower1", "k2-lower1", "k3-lower1",...), ("k1-upper1", "k2-upper1", "k3-upper1", ...)),
PARTITION partition_name2 VALUES [("k1-lower1-2", "k2-lower1-2", ...), ("k1-upper1-2", MAXVALUE, ))
)
- 示例如下:
PARTITION BY RANGE(`date`)
(
PARTITION `p201701` VALUES [("2017-01-01"), ("2017-02-01")),
PARTITION `p201702` VALUES [("2017-02-01"), ("2017-03-01")),
PARTITION `p201703` VALUES [("2017-03-01"), ("2017-04-01"))
)
2、LESS THAN:仅定义分区上界。下界由上一个分区的上界决定。
PARTITION BY RANGE(col1[, col2, ...])
(
PARTITION partition_name1 VALUES LESS THAN MAXVALUE | ("value1", "value2", ...),
PARTITION partition_name2 VALUES LESS THAN MAXVALUE | ("value1", "value2", ...)
)
- 示例如下:
PARTITION BY RANGE(`date`)
(
PARTITION `p201701` VALUES LESS THAN ("2017-02-01"),
PARTITION `p201702` VALUES LESS THAN ("2017-03-01"),
PARTITION `p201703` VALUES LESS THAN ("2017-04-01"),
PARTITION `p2018` VALUES [("2018-01-01"), ("2019-01-01")),
PARTITION `other` VALUES LESS THAN (MAXVALUE)
)
3、BATCH RANGE:批量创建数字类型和时间类型的 RANGE 分区,定义分区的左闭右开区间,设定步长。
PARTITION BY RANGE(int_col)
(
FROM (start_num) TO (end_num) INTERVAL interval_value
)
PARTITION BY RANGE(date_col)
(
FROM ("start_date") TO ("end_date") INTERVAL num YEAR | num MONTH | num WEEK | num DAY | 1 HOUR
)
- 示例如下:
PARTITION BY RANGE(age)
(
FROM (1) TO (100) INTERVAL 10
)
PARTITION BY RANGE(`date`)
(
FROM ("2000-11-14") TO ("2021-11-14") INTERVAL 2 YEAR
)
4、MULTI RANGE:批量创建 RANGE 分区,定义分区的左闭右开区间。示例如下:
PARTITION BY RANGE(col)
(
FROM ("2000-11-14") TO ("2021-11-14") INTERVAL 1 YEAR,
FROM ("2021-11-14") TO ("2022-11-14") INTERVAL 1 MONTH,
FROM ("2022-11-14") TO ("2023-01-03") INTERVAL 1 WEEK,
FROM ("2023-01-03") TO ("2023-01-14") INTERVAL 1 DAY,
PARTITION p_20230114 VALUES [('2023-01-14'), ('2023-01-15'))
)
5、 按天分区样例 :
CREATE TABLE dws_vehicle_stopover_point_di
(
data_time INT NOT NULL COMMENT '数据所属时间(如20240619)',
parking_duration INT NOT NULL COMMENT '停车时长',
parking_start_time BIGINT NOT NULL COMMENT '停留开始时间',
parking_end_time BIGINT NOT NULL COMMENT '停留结束时间',
vehicle_frame_no VARCHAR(20) NOT NULL COMMENT '车架号',
stopover_point_lat float not null comment '停留点纬度',
stopover_point_lon float not null comment '停留点经度'
) ENGINE = OLAP
COMMENT '车辆停留点日度表'
PARTITION BY RANGE (data_time) ()
DISTRIBUTED BY HASH(vehicle_frame_no) BUCKETS 10
PROPERTIES (
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.prefix" = "p",
"dynamic_partition.start" = "-2147483648",
"dynamic_partition.end" = "1",
"dynamic_partition.create_history_partition" = "true",
"dynamic_partition.history_partition_num" = "499",
"replication_num" = "1"
);
动态分区
-
规则参数
动态分区的规则参数都以dynamic_partition.
为前缀: -
dynamic_partition.enable
是否开启动态分区特性。可指定为
TRUE
或FALSE
。如果不填写,默认为 TRUE。如果为 FALSE,则 Doris 会忽略该表的动态分区规则。 -
dynamic_partition.time_unit
(必选参数)动态分区调度的单位。可指定为 HOUR、DAY、WEEK、MONTH、YEAR。分别表示按小时、按天、按星期、按月、按年进行分区创建或删除。
-
dynamic_partition.prefix
(必选参数)动态创建的分区名前缀。
-
dynamic_partition.start
动态分区的起始偏移,为负数。根据
time_unit
属性的不同,以当天(星期/月)为基准,分区范围在此偏移之前的分区将会被删除。如果不填写,则默认为-2147483648
,即不删除历史分区。 -
dynamic_partition.end
(必选参数)动态分区的结束偏移,为正数。根据
time_unit
属性的不同,以当天(星期/月)为基准,提前创建对应范围的分区。 -
dynamic_partition.create_history_partition
默认为 false。当置为 true 时,Doris 会自动创建所有分区,具体创建规则见下文。同时,FE 的参数
max_dynamic_partition_num
会限制总分区数量,以避免一次性创建过多分区。当期望创建的分区个数大于max_dynamic_partition_num
值时,操作将被禁止。
当不指定 start 属性时,该参数不生效。 -
dynamic_partition.history_partition_num
当
create_history_partition
为true
时,该参数用于指定创建历史分区数量。默认值为 -1,即未设置。
二、按月分区【 List 分区】 :
-
分区列支持 BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, DATE, DATETIME, CHAR, VARCHAR 数据类型,分区值为枚举值。只有当数据为目标分区枚举值其中之一时,才可以命中分区。
-
Partition 支持通过 VALUES IN (…) 来指定每个分区包含的枚举值。
-
举例如下:
PARTITION BY LIST(city)
(
PARTITION `p_cn` VALUES IN ("Beijing", "Shanghai", "Hong Kong"),
PARTITION `p_usa` VALUES IN ("New York", "San Francisco"),
PARTITION `p_jp` VALUES IN ("Tokyo")
)
- List 分区也支持多列分区,示例如下:
PARTITION BY LIST(id, city)
(
PARTITION p1_city VALUES IN (("1", "Beijing"), ("1", "Shanghai")),
PARTITION p2_city VALUES IN (("2", "Beijing"), ("2", "Shanghai")),
PARTITION p3_city VALUES IN (("3", "Beijing"), ("3", "Shanghai"))
)
1、按月分区样例 :
CREATE TABLE dl_10_hy_diff_vehicle (
diff_month BIGINT NOT NULL COMMENT '比对月份',
plate_color BIGINT NULL COMMENT '车牌颜色',
veh_no VARCHAR(40) NULL COMMENT '车牌号',
pro_code BIGINT NOT NULL COMMENT '省份',
crc VARCHAR(40) NULL COMMENT '比对加密串',
flag BIGINT NULL COMMENT '比对标记',
create_time DATETIME NULL DEFAULT CURRENT_TIMESTAMP COMMENT '生成时间',
update_time DATETIME NULL COMMENT '更新时间'
) ENGINE=OLAP
DUPLICATE KEY(diff_month, plate_color, veh_no)
COMMENT 'yz平台-hy平台-车辆比对结果表'
PARTITION BY LIST (diff_month) (PARTITION p2024046 VALUES IN ("202404"),
PARTITION p202405 VALUES IN ("202405")) DISTRIBUTED BY HASH(diff_month)
BUCKETS 10 PROPERTIES ( "replication_allocation" = "tag.location.default: 3",
"min_load_replica_num" = "-1",
"is_being_synced" = "false",
"storage_medium" = "hdd",
"storage_format" = "V2",
"inverted_index_storage_format" = "V1",
"light_schema_change" = "true",
"disable_auto_compaction" = "false",
"enable_single_replica_compaction" = "false",
"group_commit_interval_ms" = "10000",
"group_commit_data_bytes" = "134217728" );
总结
如果此篇文章有帮助到您, 希望打大佬们能
关注
、点赞
、收藏
、评论
支持一波,非常感谢大家!
如果有不对的地方请指正!!!