持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情
Duplicate 模型(冗余模型)
Duplicate Key 的模型,就是说支持一个用户导入之后把这个数据全部放在数据库里面,我们不再做提前的聚合,也不单独保证唯一性,只做一个排序。因此,我们引入 Duplicate 数据模型来满足这类需求。
如:对于有些日志分析它不太在意数据多几条或者少几条,可能只关心排序,这个时候可能重复 Key 的模型会更加有效果。
- 演示
| 操作步骤 | 说明 |
|---|---|
| 1 | 创建doris表 |
CREATE TABLE IF NOT EXISTS test_db.example_log**(** **timestamp** DATETIME NOT NULL COMMENT "日志时间" , **type** INT NOT NULL COMMENT "日志类型" , error_code INT COMMENT "错误码" , error_msg VARCHAR ( 1024 ) COMMENT "错误详细信息" , op_id BIGINT COMMENT "负责人id" , op_time DATETIME COMMENT "处理时间"**)**DUPLICATE KEY ( **timestamp** , **type** **)**DISTRIBUTED BY HASH ( **timestamp** ) BUCKETS 10 ; | |
| 2 | 插入数据 |
| insert into test_db . example_log values ( '2020-10-01 08:00:05' , 1 , 404 , 'not found page' , 101 , '2020-10-01 08:00:05' **);**insert into test_db . example_log values ( '2020-10-01 08:00:05' , 1 , 404 , 'not found page' , 101 , '2020-10-01 08:00:05' **);**insert into test_db . example_log values ( '2020-10-01 08:00:05' , 2 , 404 , 'not found page' , 101 , '2020-10-01 08:00:06' );insert into test_db . example_log values ( '2020-10-01 08:00:06' , 2 , 404 , 'not found page' , 101 , '2020-10-01 08:00:07' ); | |
| 3 | 查询数据 |
| select * from test_db.example_log ; | |
| 这种数据模型区别于 Aggregate 和 Uniq 模型。数据完全按照导入文件中的数据进行存储,不会有任何聚合。即使两行数据完全相同,也都会保留。 而在建表语句中指定的 DUPLICATE KEY,只是用来指明底层数据按照那些列进行排序 |
案例演示
- 在聚合表的基础上,按照其他维度再进一步聚合,提升查询效率。
以site_visit表为例
| 操作步骤 | 说明 |
|---|---|
| 1 | 创建表 |
CREATE TABLE IF NOT EXISTS test_db . site_visit**(** user_id LARGEINT NOT NULL COMMENT "用户id" , **date** DATE NOT NULL COMMENT "数据灌入日期时间" , city VARCHAR ( 20 ) COMMENT "用户所在城市" , age SMALLINT COMMENT "用户年龄" , sex TINYINT COMMENT "用户性别" , last_visit_date DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间" , cost BIGINT SUM DEFAULT "0" COMMENT "用户总消费" , max_dwell_time INT MAX DEFAULT "0" COMMENT "用户最大停留时间" , min_dwell_time INT MIN DEFAULT "99999" COMMENT "用户最小停留时间"**)**AGGREGATE KEY ( user_id , **date** , city , age , sex **)**DISTRIBUTED BY HASH ( user_id ) BUCKETS 10 ; | |
| 2 | 查看表的结构信息 |
| desc site_visit all; | |
| 3 | 比如需要查看某个城市的user_id数,那么可以建立一个只有user_id和city的rollup |
| alter table site_visit add rollup rollup_city_userid ( city , user_id ); | |
| 4 | 查看表的结构信息 |
| desc site_visit all; | |
| 5 | 然后可以通过explain查看执行计划,是否使用到了rollup |
| explain select date from site_visit where city='北京'; | |
| Doris 会自动命中这个 ROLLUP 表,从而只需扫描极少的数据量,即可完成这次聚合查询。 | |
| 6 | 通过命令查看完成状态 |
| SHOW ALTER TABLE ROLLUP; |