在我们使用做数据仓库的时候,不管是dwd、dws,ads,dim层等,随着业务需求的增加,我们经常会涉及到在某张表里面添加一些列维度,既然是数仓,那么每张表的数据肯定是非常大的一个量级了,此时大家的做法是什么呢?
常用的途径有:
直接在原有表的基础上alter table add colum xxxx
这种在传统的数据库mysql中经常会涉及到,但是这种只适合小数据量的表,同时也会涉及到锁表,如果是数据量比较大或者业务高峰期就不可取的,所以基于此大家的升级方案就是:
创建一张新表,包含新的列,然后再把老表的数据导入到新表中,再把老表和新表的名字rename互换
这种虽然不涉及到锁表,但是整体的周期拉的非常长,并且还要考虑在迁移数据的过程中,正在跑的业务怎么办?是否需要停掉?
在doris中提供了Light Schema Change的形式来对表结构进行调整,即使数据量非常大的情况下也可以实现毫秒级的变更数据表结构。他的原理是:
通过调整元数据管理来实现快速的表结构变更。不需要更改原始表的数据文件
下面我们来演示下在doris中如何使用Light Schema Change的特性。
一、创建表
这里还是一样,创建一张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" );
创建成功之后如下图:
二、插入数据
这里为了演示方便,我们暂时插入一条数据即可,方便后面查询演示使用
insert into users(id,username,password,phoneno,email) values(1,'zhangsan','123456','13888888888','test@qq.com');
三、修改表结构-增加两个字段
然后我们演示修改表结构,增加两个sex和age字段
ALTER TABLE users ADD COLUMN sex VARCHAR(2) DEFAULT '男', ADD COLUMN age INT DEFAULT '10';
查询看结果
上面我们使用alter table语句就是动态变更表结构的语句,这里我们单条数据执行很快,有条件的话,可以向表里面插入千万级亿级数据,再执行下新增,也可以看到执行非常快,都是毫秒级别。这就是利用到了doris的Light Schema Change特性。他的核心主要是调整元数据管理,而不更改原始数据文件,所以变更表结构非常的快。
四、修改表结构-删除4个字段
上面我们演示了新增字段,这里再演示删除字段
ALTER TABLE users drop COLUMN sex, drop COLUMN nickname, drop COLUMN user_ico, drop COLUMN age;
都非常快,毫秒级。
备注:
1、使用Light Schema Change特性的适合需要注意以下几点:
1、一张表在同一时刻只能允许一个Schema Change 作业在运行,所以在执行的适合需要等待前一个完成,再执行操作下一个。 2、新增列的适合,需要设置默认值。 3、尽快当前Light Schema Change特性变更表结构比较快,但是还是建议在业务非高峰期执行,以防止万一出问题影响线上业务。 4、doris1.2.0版本开始,就支持Light Schema Change特性,在doris2.0版本及以上是默认开启此特性的,不需要单独配置开启。
还没有评论,来说两句吧...