Doris按天/月分区介绍及使用【Range 分区和List 分区】

前言

在某些使用场景下,用户会按天对表进行分区,每天定时执行例行任务。此时,用户需要手动管理分区。否则可能会因为用户没有创建分区而导致数据导入失败,给用户带来额外的维护成本。

通过动态分区功能,用户可以在建表时设置动态分区规则。 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 DAY1 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

    是否开启动态分区特性。可指定为 TRUEFALSE。如果不填写,默认为 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_partitiontrue 时,该参数用于指定创建历史分区数量。默认值为 -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" );

总结

如果此篇文章有帮助到您, 希望打大佬们能关注点赞收藏评论支持一波,非常感谢大家!
如果有不对的地方请指正!!!

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lfwh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值