tnblog
首页
视频
资源
登录

Doris Rollup(学习笔记)

164人阅读 2025/4/3 11:48 总访问:3482968 评论:0 收藏:0 手机
分类: 大数据

Doris Rollup(学习笔记)


ROLLUP 在多维分析中是“上卷”的意思,即将数据按某种指定的粒度进行进一步聚合。
之前的聚合模型:


1.求每个城市的每个用户的每天的总销售额

  1. select
  2. user_id,city,date
  3. sum(sum_cost) as sum_cost
  4. from t
  5. group by user_id,city,date


2.求每个用户、每个城市的总消费额

  1. select
  2. user_id,city
  3. sum(sum_cost) as sum_cost
  4. from t
  5. group by user_id,city


3.求每个用户的总消费额

  1. select
  2. user_id
  3. sum(sum_cost) as sum_cost
  4. from t
  5. group by user_id

基本概念


通过建表语句创建出来的表称为 Base 表(Base Table,基表)
在 Base 表之上,我们可以创建任意多个 ROLLUP 表。这些 ROLLUP 的数据是基于 Base 表产生的,并且在物理上是独立存储的。
Rollup表的好处:
1.和基表共用一个表名,doris会根据具体的查询逻辑选择合适的数据源(合适的表)来计算结果
2.对于基表中数据的增删改,rollup表会自动更新同步

Aggregate 模型中的 ROLLUP


查看下之前建得一张表:

示例1:查看某个用户的总消费


添加一个rollup

  1. alter table aggregate表名 add rollup "rollup表的表名" (user_id,city,date,cost);
  2. 添加三张rollup
  3. alter table ex_user add rollup rollup_ucd_cost(user_id,city,date,cost);
  4. alter table ex_user add rollup rollup_u_cost(user_id,cost);
  5. alter table ex_user add rollup rollup_cd_cost(city,date,cost);
  6. 添加这个rollup表,需要消耗时间,所以执行完之后需要等一会儿,再使用desc 查看表结构。
  7. alter table ex_user drop rollup rollup_u_cost;
  8. alter table ex_user drop rollup rollup_cd_cost;
  9. --如果是replace聚合类型得value,需要指定所有得key
  10. -- alter table ex_user add rollup rollup_cd_visit(city,date,last_visit_date);
  11. -- ERROR 1105 (HY000): errCode = 2, detailMessage = Rollup should contains
  12. -- all keys if there is a REPLACE value
  13. --添加完成之后可以show一下,看看底层得rollup有没有执行完成,这里只是记录没有实际的用处
  14. SHOW ALTER TABLE ROLLUP;


再次查看该表得详细信息后发现,多了一个IndexName为rollup_ucd_cost
Doris 会自动命中这个 ROLLUP 表,从而只需扫描极少的数据量,即可完成这次聚合查询。

  1. explain SELECT user_id, sum(cost) FROM ex_user GROUP BY user_id;

示例 2:获得不同城市,不同年龄段用户的总消费、最长和最短页面驻留时间

  1. alter table ex_user add rollup rollup_city(city,age,cost,max_dwell_time,min_dwell_time);
  2. -- 当创建好了立即去查看得时候就会发现,他还没有开始
  3. SHOW ALTER TABLE ROLLUP;
  4. 然后过会再去查询得时候,他就完成了,看他的状态即可


分别执行下面得三条语句,看看有什么不一样的??

  1. explain SELECT city, age, sum(cost), max(max_dwell_time), min(min_dwell_time) FROM ex_user GROUP BY city, age;
  2. explain SELECT city, sum(cost), max(max_dwell_time), min(min_dwell_time) FROM ex_user GROUP BY city;
  3. explain SELECT city, age, sum(cost), min(min_dwell_time) FROM ex_user GROUP BY city, age;


很显然得发现,维度是city,或者age,或者他们组合得时候,都是可以命中这个rollup得,相对来说效率会高很多

Unique 模型中的 ROLLUP


unique模型示例表

  1. drop table if exists test.user;
  2. CREATE TABLE IF NOT EXISTS test.user
  3. (
  4. `user_id` LARGEINT NOT NULL COMMENT "用户 id",
  5. `username` VARCHAR(50) NOT NULL COMMENT "用户昵称",
  6. `city` VARCHAR(20) COMMENT "用户所在城市",
  7. `age` SMALLINT COMMENT "用户年龄",
  8. `sex` TINYINT COMMENT "用户性别",
  9. `phone` LARGEINT COMMENT "用户电话",
  10. `address` VARCHAR(500) COMMENT "用户地址",
  11. `register_time` DATETIME COMMENT "用户注册时间" )
  12. UNIQUE KEY(`user_id`, `username`)
  13. DISTRIBUTED BY HASH(`user_id`) BUCKETS 1
  14. PROPERTIES (
  15. "replication_num" = "1"
  16. );


插入语句

  1. insert into test.user values
  2. (10000,'zss','北京',18,0,12345678910,'北京朝阳区 ','2017-10-01 07:00:00'),
  3. (10000,'zss','北京',18,0,12345678910,'北京朝阳区 ','2017-10-01 08:00:00'),
  4. (10001,'lss','北京',20,0,12345678910,'北京海淀区','2017-11-15 06:10:20');


在unique模型中做rollup表,rollup的key必须延用base表中所有的key,不同的是value可以随意指定

  1. alter table user add rollup rollup_username_id(username,user_id,age);


这里我没尝试成功不知道为什么,但是好像没什么意义。

试想一下:
如果不沿用base表中所有的key,只针对上面的user_id进行rollup,那么他的age值取20还是19呢?好像也就不确定了,毕竟底层的aggregationType 用的是replace,到底谁替换谁就不确定了

Duplicate 模型中的 ROLLUP


因为 Duplicate 模型没有聚合的语意。
所以该模型中的 ROLLUP,已经失去了“上卷” 这一层含义。
而仅仅是作为调整列顺序,以命中前缀索引的作用。
下面详细介绍前缀索引,以及如何使用 ROLLUP 改变前缀索引,以获得更好的查询效率。

ROLLUP 调整前缀索引(新增一套前缀索引)


因为建表时已经指定了列顺序,所以一个表只有一种前缀索引。
这对于使用其他不能命中前缀索引的列作为条件进行的查询来说,效率上可能无法满足需求。
因此,我们可以通过创建 ROLLUP 来人为的调整列顺序。
Base 表结构如下:


我们可以在此基础上创建一个 ROLLUP 表:

为什么说rollup 可以调整列值的顺序?
rollup 是一个真实的表,它是base表的一种复制。
我有什么动力调整这个顺序?
因为我们以前学习过一个优化索引,叫做前缀索引法则,按照书写顺序来匹配,匹配越高,效率越高。


可以看到,ROLLUP 和 Base 表的列完全一样,只是将 user_id 和 age 的顺序调换了。
那么当我们进行如下查询时:

  1. SELECT * FROM table where age=20 and message LIKE "%error%";


会优先选择 ROLLUP 表,因为 ROLLUP 的前缀索引匹配度更高。

示例:针对上面的log_detail这张基表添加两个rollup表

  1. 按照type error_code 进行建前缀索引
  2. alter table log_detail add rollup rollup_tec(type,error_code,timestamp,error_msg,op_id,op_time);
  3. --删除
  4. --alter table log_detail drop rolluprollup_tec
  5. 按照op_iderror_code 进行建前缀索引
  6. alter table log_detail add rollup rollup_oec(op_id,error_code,timestamp,type,error_msg,op_time);


查看表中基表和rollup表。


示例:看如下sql会命中哪一张表。

  1. explain select * from log_detail where type = 1; --rollup_tec
  2. explain select * from log_detail where type = 1 and error_code = 404; --rollup_tec
  3. explain select * from log_detail where op_id = 101 ; -- rollup_oec
  4. explain select * from log_detail where op_id = 101 and error_code = 404; -- rollup_oec
  5. explain select * from log_detail where timestamp = '2017-10-01 08:00:05' ; --log_detail
  6. explain select * from log_detail where timestamp = '2017-10-01 08:00:05' and type = 1;--log_detail

ROLLUP使用说明
1.ROLLUP 是附属于 Base 表的,用户可以在 Base 表的基础上,创建或删除 ROLLUP,但是不能在查询中显式的指定查询某 ROLLUP。是否命中 ROLLUP 完全由 Doris 系统自动决定
2.ROLLUP 的数据是独立物理存储的。
因此,创建的 ROLLUP 越多,占用的磁盘空间也就越大。
同时对导入速度也会有影响,但是不会降低查询效率(只会更好)。
3.ROLLUP 的数据更新与 Base 表是完全同步的。
用户无需关心这个问题。
4.在聚合模型中,ROLLUP 中列的聚合类型,与 Base 表完全相同。
在创建 ROLLUP 无需指定,也不能修改。
5.可以通过 EXPLAIN your_sql; 命令获得查询执行计划,在执行计划中,查看是否命中 ROLLUP。
6.可以通过 DESC tbl_name ALL; 语句显示 Base 表和所有已创建完成的 ROLLUP


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

微信小程序学习笔记

小程序是什么?小程序是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或者搜一下即可打...

ASP.NET Core 依赖注入(基础[学习笔记]

ASP.NET Core 依赖注入(基础)[学习笔记][TOC] 环境准备 项目结构 服务类 GenericService.cs public...

ASP.NET Core 作用域与对象释放行为 (基础[学习笔记]

ASP.NET Core 作用域与对象释放行为 (基础)[学习笔记][TOC] 知识大纲 作用域 IServiceScope 实现IDisposable接...

.Net Windbg 与汇编基础(学习笔记)

.Net Windbg 与汇编基础(学习笔记)[TOC] 为什么要学习汇编?有时候再Debug下可以运行的逻辑,但在Release下却无法实现。举...

python 机器学习的尝鲜实例(一学习笔记

python 机器学习的尝鲜实例(一)学习笔记[TOC] 确定问题任务:利用加州人口普查数据建立该州房价模型问题要确定业务目标...

python 初探神经网络(一元一次函数学习笔记

python 初探神经网络(一元一次函数)学习笔记[TOC] B站学习课程 豆豆实验有个小蓝的生物,想吃豆豆,豆豆越大豆豆的毒性...

python 方差代价函数(学习笔记

python 方差代价函数(学习笔记)[TOC] 在Rosenblatt感知器中计算有个问题?如果只有两个豆豆的情况下,且二者都相差0.15...

python 梯度下降和反向传播(上学习笔记

python 梯度下降和反向传播(上)(学习笔记)[TOC] 基本定义在开始之前我们来学习一些求导(斜率)定义与公式。求斜率求...

python 梯度下降和反向传播(下学习笔记

python 梯度下降和反向传播(下)(学习笔记)[TOC] 前言 回到我们以前讲的有一个激活函数b,这是用来干嘛的呢?举个例子...

python 激活函数分类Logistic函数(学习笔记

python 激活函数分类Logistic函数(学习笔记)[TOC] 前言有时候,我们对某个事物的判断不是1就是0。举例:我们的吃馒头时...

python 神经网络隐藏层学习笔记

python 神经网络隐藏层学习笔记[TOC] 回顾上节关于我们对与豆豆的分类毒性,我们可以使用Logistic函数对豆豆的毒性进行分...

python 高维空间:机器如何面对越来越复杂的问题(学习笔记)

python 高维空间:机器如何面对越来越复杂的问题(学习笔记)[TOC] 机器如何面对越来越复杂的问题?当我们豆豆的毒性不仅与大...

python 深度学习DeepLearning(学习笔记

python 深度学习DeepLearning(学习笔记)[TOC] 什么是深度学习DeepLearning?深度学习就是不断增加一个神经网络的隐藏层...

python 打破图像识别的瓶颈(学习笔记

python 打破图像识别的瓶颈(学习笔记)[TOC] 手写识别mnist数据集的图片采用的28*28的灰度图。灰度图显示的原理一行有28...

python 循环:序列依赖问题(学习笔记

python 循环:序列依赖问题(学习笔记)[TOC] 循环:序列依赖问题当我们要机器识别语言时,不以字符为单位,而是以词为单...
这一世以无限游戏为使命!
排名
2
文章
638
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术