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);

查看表数据

doris没有timestamp_数据

再插入一条,key不同时,不会覆盖

insert into order_tab values(1,'李四',200);

查看表数据,会有两条

doris没有timestamp_doris没有timestamp_02


再插入一条,key相同时,会覆盖

insert into order_tab values(1,'张三',200);

查看结果

doris没有timestamp_实时大数据_03

这样就可以完成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

操作如下:

因为我建的是动态分区分桶表,所以在操作分区之前需要将动态分区的配置关掉,否则报错

doris没有timestamp_数据仓库_04

首先关掉动态分区

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'));

查询前一天分区,分区是空的

doris没有timestamp_olap_05


然后重跑broker load脚本

show load

已完成

doris没有timestamp_doris没有timestamp_06

查看分区数据,是更新后的表数据

doris没有timestamp_数据仓库_07


注意!!!最后一定要把动态分区配置打开,不然后续调度就就会报错(没有分区)

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集群的配置和维护的要求就更严格了