在使用doris做数据仓库的时候,不管是在dwd层或者dws层或者其他层,我们经常会涉及到更新某张表的数据,对应的应用场景有:
1、更新现有表的部分列的值 2、拼接大表,在现有表的基础上拼接上缺失的部分列数据,但是当前数据源又没有全量的列数据
此时的应用场景就是一个部分列更新的场景。在doris中,实现了基于主键的导入更新机制。
传统的更新数据的顺序是:
1、读取出整行的数据 2、把整行的数据进行部分列值得更新 3、把新的整行数据给写回去
传统的数据库或者nosql中就是这样进行数据更新的,但是在doris中,实现了基于主键的导入更新机制,我们只需要使用insert语句,针对主键id进行插入即可,遇到存在的列值就进行更新,遇到不存在的列值就直接插入,最后形成一条完整的行数据。由于doris是基于mvcc的列式存储,同时由于不需要读取对应的行数据再进行写回的操作,极大的增加了数据的写入效率。
对于doris的部分列更新的适用场景有:
1、不同job对应同一主键id的大表拼接业务场景。 2、统计表中,按日,按月进行数据修正的统计表部分列更新。
doris部分列更新需要注意的点有:
1、doris的部分列更新支持高并发写入更新,但是他的前提条件是要更新的列比较少。不支持非常多列的数据同时更新(并发度会降低) 2、doris2.0.2版本及以后的版本才支持insert into对表数据进行部分列更新 3、不支持在有同步物化视图的表上进行部分列更新
最后我们来演示一下部分列更新的示例。
一、创建表
这里我们创建一张示例users表,创建的示例语句是:
create table users ( id BIGINT, username varchar(20), password varchar(32), nickname varchar(20), user_ico varchar(50), phoneno varchar(11), email varchar(11) ) ENGINE=OLAP unique KEY(`id`) COMMENT '用户表' DISTRIBUTED BY HASH(`id`) BUCKETS 3 PROPERTIES ( "replication_num" = "1" );
这里我们创建的表示一张普通的用户表,使用unique模式。主键为id,创建成功之后如下:
二、插入一条数据
这里我们为了后面的更新演示数据,直接插入一条不包含所有字段的数据,示例如下:
insert into users(id,username,password) values(1,'zhangsan','123456');
数据也能被查询出来:
三、设置更新模式
这里如果需要让其支持部分列更新的话,需要设置对应的模式
set enable_unique_key_partial_update=true;
这里设置模式主要是为了在Merge-on-Write模式下开启insert into部分列更新语义,这样子在执行数据insert into的时候,遇到主键一致的情况下,实现部分列数据的更新,而不是全部覆盖。
备注:
1、doris2.0.2及以上都支持Merge-on-Write 2、使用insert into之前需开启部分列更细语义,避免insert into的时候把数据直接覆盖掉了
四、更新部分列之修正已存在的列值
上面我们这是了id,username和password,这里我们比如想改密码的话,也可以直接使用insert into语句即可,例如:
insert into users(id,username,password) values(1,'zhangsan','654321');
再查询数据:
就可以看到密码被修改了,记住这里使用的是insert into语句。
五、更新部分列之新增不存在值得列
这里比如我们想修正用户的phoneno和email,那么我们只需要知道他的id为1,使用insert into就可以直接进行修正。
insert into users(id,phoneno,email) values(1,'13888888888','test@qq.com');
再查询数据
可以看到我们插入的是phoneno核email,但是username核password都得以保留了。这就是doris中部分列的更新。
以上为了演示方便,所以我们直接在navicat里面使用insert into语句进行演示的。在实际中导入数据主要还是通过stream load 或者flink cdc的模式来进行引入。
以上就是doris部分列更新的具体示例,记住核心是在Merge-on-Write模式下开启部分列更新语义,即设置:
set enable_unique_key_partial_update=true
还没有评论,来说两句吧...