Doris之分区分桶表的insert overwrite实现(一)
(一) 实时项目
如果是实时,就要讲求时效性,直接选用UNIQUE KEY模型表,选定不可重复的列为unique key即可
建立单分区表简单举例
CREATE TABLE order_tab
(
orderid BIGINT,
username VARCHAR(32),
amount BIGINT DEFAULT '0'
)
UNIQUE KEY(orderid,username)
DISTRIBUTED BY HASH(orderid) BUCKETS 10
PROPERTIES("replication_num" = "1");
之后插入数据
insert into order_tab values(1,'张三',100);
查看表数据
再插入一条,key不同时,不会覆盖
insert into order_tab values(1,'李四',200);
查看表数据,会有两条
再插入一条,key相同时,会覆盖
insert into order_tab values(1,'张三',200);
查看结果
这样就可以完成insert overwrite 的实现
(二)离线项目[T+1]
如果是离线项目,并不追求时效性,如果选用UNIQUE KEY模型表,每次导入都会让doris进行大量数据的对比,对doris的维护并不友好,不建议使用,故而选用DUPLICATE KEY模型表
建表使用DUPLICATE KEY模型,然后每日调度使用broker load即可
建表例子如下:
CREATE TABLE `usertouch_all_kpi_detail_user_day_snap` (
`mid` BIGINT(20) NOT NULL COMMENT "活动id",
`active_id` INT(11) NOT NULL COMMENT "活动id",
`plan_id` INT(11) NOT NULL COMMENT "活动id",
`wait_send_time` DATE NOT NULL COMMENT "触达时间",
`par_date` DATE NOT NULL COMMENT "分区字段",
`touch_flag` INT(11) NULL COMMENT "触达标识",
`succ_flag` INT(11) NULL COMMENT "发送成功标识",
`target_flag` INT(11) NULL COMMENT "目标标识",
`click_flag` INT(11) NULL COMMENT "点击标识",
`plan_flag` INT(11) NULL COMMENT "计划报名标识",
`xiao_flag` INT(11) NULL COMMENT "小课转化标识",
`xuda_flag` INT(11) NULL COMMENT "大课续保标识",
`gmv_flag` INT(11) NULL COMMENT "大课续报gmv(plan_id粒度)"
) ENGINE = OLAP
DUPLICATE KEY(MID,active_id,plan_id,wait_send_time,par_date) COMMENT "指标明细表"
PARTITION BY RANGE(par_date)()
DISTRIBUTED BY HASH(mid) BUCKETS 10 PROPERTIES (
"replication_num" = "3",
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-7",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.replication_num" = "3",
"dynamic_partition.buckets" = "10"
);
首先要有broker load调度脚本(可以参考我写的broke load写入doris详解),然后针对前一天的分区数据进行更新操作就可以了
思路一:将前一天的分区删除,然后为表再新建前一天分区,之后导入数据,通过操作来实现数据更新,即完成insert overwrite
操作如下:
因为我建的是动态分区分桶表,所以在操作分区之前需要将动态分区的配置关掉,否则报错
首先关掉动态分区
ALTER TABLE usertouch_all_kpi_detail_user_day_snap SET ("dynamic_partition.enable" = "false")
删除前一天分区
ALTER TABLE usertouch_all_kpi_detail_user_day_snap DROP PARTITION p20211213;
新建前一天分区
ALTER TABLE usertouch_all_kpi_detail_user_day_snap ADD PARTITION p20211213 VALUES [('2021-12-13'), ('2021-12-14'));
查询前一天分区,分区是空的
然后重跑broker load脚本
show load
已完成
查看分区数据,是更新后的表数据
注意!!!最后一定要把动态分区配置打开,不然后续调度就就会报错(没有分区)
ALTER TABLE usertouch_all_kpi_detail_user_day_snap SET ("dynamic_partition.enable" = "true")
总结:这样就完成了insert overwrite的实现,但是在前一天分区的删除重建过程中,数据是无法被访问的
思路二:新建临时分区,将更新数据写入临时分区,最后用临时分区代替前一天分区
具体操作如下
新建临时分区
关闭动态分区
ALTER TABLE usertouch_all_kpi_detail_user_day_snap ADD TEMPORARY PARTITION tp20211213 VALUES [("2021-12-13"), ("2021-12-14"));
用broke load脚本将数据写入临时分区
之后,将表的前一天正式分区替换为临时分区
ALTER TABLE usertouch_all_kpi_detail_user_day_snap REPLACE PARTITION (p20211213) WITH TEMPORARY PARTITION (tp20211213);
总结:这样实现insert overwrite的操作过程中,数据仍是可以被访问的
思路三:当然,也可以直接使用选用UNIQUE KEY模型表,这样对于doris集群的配置和维护的要求就更严格了