Doris动态分区问题汇总(5个)
网上关于 Doris 动态分区的文章似乎不太多,而且很多都是从官方文档中借鉴过来的,这段时间自己搭项目,踩过不少 Doris 动态分区表的坑,所以来和大家分享一下。
通常来说,通过日期的自增来作为 Doris 分区的动态生成最为常用,以下基于此场景为例。
1) 手动将动态分区转为手动分区模式:
2) 创建分区,一种是创建当周期之前所有数据的分区:
3) 一种是创建只存在当周期之内的数据的分区:
4) 手动将手动分区调整为动态分区:
注意:如果需要创建多个分区,推荐创建只存在当周期之内的数据的分区,避免时间段会有冲突,如果当前存在时间段冲突的分区区间,需要具体问题具体分析。
2) 根据分区值查询:
1. 动态分区使用场景
- 时间序列数据处理。
- 利用动态分区的特性,进行表数据的生命周期管理,节省空间。
- 数据仓库中用来做快照表。
通常来说,通过日期的自增来作为 Doris 分区的动态生成最为常用,以下基于此场景为例。
2. 如何创建Doris动态分区
create table dwd.dwd_test( repay_type varchar(64) comment "还款方式", order_cnt bigint comment "还款订单数", pt date comment "分区字段" ) DUPLICATE KEY(repay_type) COMMENT "dwd测试表" partition by range(pt)() DISTRIBUTED by HASH(repay_type) BUCKETS 1 PROPERTIES( "dynamic_partition.enable" = "true", "dynamic_partition.time_unit" = "DAY", "dynamic_partition.start" = "-7", "dynamic_partition.end" = "3", "dynamic_partition.prefix" = "p", -- "dynamic_parititon.buckets" = "1", "replication_num" = "1" );
3. 动态分区参数详解
- pt 分区字段(也可自行命名),必须要带,而且必须是 date 类型。
- DUPLICATE KEY Doris 自带的模型,为明细模型,Doris 还支持唯一模型和聚合模型,可在官网了解。
- partition by range(pt)() 这个小括号必须要带,支持动静态切换。
- BUCKETS 1 分桶数为 1,也可以在 properties 中设定。
- "dynamic_partition.enable" = "true", -- 是否开启动态分区。
- "dynamic_partition.time_unit" = "DAY", -- 动态分区调度单位。
- "dynamic_partition.start" = "-7", -- 保留过去 7 天的数据,可以用来做表的生命周期管理,为负数,如果不填,默认值 -2147483648,可以理解为永久保留。
- "dynamic_partition.end" = "3", -- 提前创建分区数,比如在 2024-10-26 日建表,那么查看表分区会有 p20241026、p20241027、p20241028。
- "dynamic_partition.prefix" = "p", -- 必选项,而且不能为空,通常设置为 p。
- "dynamic_parititon.buckets" = "1", -- 分桶数。
- "replication_num" = "1" -- 副本数。
4. 创建动态分区表之后,对分区进行增删改
修改动态分区通常分为 4 个步骤。1) 手动将动态分区转为手动分区模式:
alter table tb_name set ("dynamic_partition.enable" = "false");
2) 创建分区,一种是创建当周期之前所有数据的分区:
alter table tb_name add partition p20250209 values less than ("2025-02-10"); -- 即添加p20250209分区,该分区存放pt< '2025-02-10'的所有数据
3) 一种是创建只存在当周期之内的数据的分区:
alter table tb_name add partition p20250209 values [("2025-02-09"),("2025-02-10"); -- 左闭右开区间
4) 手动将手动分区调整为动态分区:
alter table tb_name set ("dynamic_partition.enable" = "true");
注意:如果需要创建多个分区,推荐创建只存在当周期之内的数据的分区,避免时间段会有冲突,如果当前存在时间段冲突的分区区间,需要具体问题具体分析。
-- 比如说现在需要添加 p20250209 p20250208 p20250207三个历史分区 -- 首先假如p20250209为以上包含< '2025-02-10'的所有数据的情况 alter table tb_name add partition p20250209 values less than ("2025-02-10"); -- 为了避免时段冲突。接下来的两个分区创建如下 alter table tb_name add partition p20250208 values [("2025-02-08"),("2025-02-09")); alter table tb_name add partition p20250207 values [("2025-02-07"),("2025-02-08"));
5. 往动态分区中写入数据,以DBeaver编辑器为例
insert overwrite table 表名 partition p${pt} -- 这里不能加'',否则最后的参数是p'2025-02-09'这种格式 select col1, col2, pt from 表名; -- 注意,这里的pt值必须要和分区的值保持一致,如果分区值是p20250209 那么pt必须为'2025-02-09',否则报错注意:往动态分区表中写入数据的时候,如果没有指定分区,会根据 pt 的值插入对应的分区当中。
6. 动态分区表的查询使用
1) 根据分区查询:select * from 表名 partition p20250209
2) 根据分区值查询:
select * from 表名 where pt = '2025-02-09'