网上关于Doris动态分区的文章似乎不太多,而且很多都是从官方文档中借鉴过来的,这段时间自己搭项目,踩过不少Doris动态分区表的坑,所以来和大家分享一下。
1:废话不多说,建表模板如下
create table dwd.dwd_test( repay_type varchar(64) comment "还款方式", order_cnt bigint comment "还款订单数", pt date comment "分区字段" -- 必须要带,而且必须是date类型 ) DUPLICATE KEY(repay_type) -- 明细模型 COMMENT "dwd测试表" partition by range(pt)() -- 这个小括号必须要带,支持动静态切换 DISTRIBUTED by HASH(repay_type) BUCKETS 1 -- 也可以在properties中写 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" -- 副本数 );
2:关于动态分区的查询,支持两种查询方式
-- 1: 通过pt字段查询 select * from test where pt = '2024-10-25'; -- 2: 通过分区查询 select * from test partition p20241025; -- 注意,这里的表不能加别名 否则会报错
3:插入语句
insert into test partition p20241025 select * from t; insert overwrite table test partition p20241025 select * from t;
4:参数传递问题
insert overwrite table dwd.dwd_test partition(p${pt}) select repay_type, count(distinct order_id) as order_cnt, '${bizdate}' from ods.ods_abank_repayment_df partition p${pt} group by repay_type;
以上为在DBeaver上往动态分区插入数据的语句。因为Doris动态分区配置中,properties中的"dynamic_partition.prefix" 的配置项是必须项,而且不能为空串,所以分区通常是p20241019格式,所以在插入的时候分区参数为p${参数名}的格式传递。
在DolphinScheduler中,全局参数不能设置类型,且会自动把'$[yyyyMMdd]'转为字符串,所以如果通过全局参数配置分区字段的话,会出现'p20241019'或者p'20241019'的情况,导致任务失败。
正确配置方法如下:
1:在当前节点中设置参数,数据类型选择INTEGER
2:注意Dolphin不支持{}的写法,注意使用[]
3:写法还是p${pt}的格式,注意不要带''
4:其他正常格式的参数,按照正常写法'${参数名}'即可,可以在当前节点设置,也可以点保存后在全局参数中配置