Apache Doris 数据建模之 Aggregate Key 模型

news2024/11/16 12:55:04

了解 Doris 数据模型对于我们使用 Doris 来解决我们业务问题非常重要,这个系列我们将详细介绍 Doris 的三种数据模型及 Doris 数据分区分桶的一些策略,帮助用户更好的使用 Doris 。

这个系列我会讲解 Doris 的三种数据模型及在这三种数据模型之上的 Rollup,物化视图及前缀索引。还有在这个三种数据模型之上的数据分区分桶的策略。

我们知道在 Doris 中,数据以表(Table)的形式进行逻辑上的描述。 一张表包括行(Row)和列(Column)。Row 即用户的一行数据。Column 用于描述一行数据中不同的字段。

列可以划分为两类:键 Key 和值 Value。从业务角度来看,键和值对应的就是维度列和指标列

Doris 针对不同场景提供了三种数据模型

  • Aggregate (聚合模型) : 将表中的列分为了Key和Value两种,数据会根据维度列进行分组,并对指标列进行聚合。
  • Unique (唯一主键模型):这个模型一般我们是在对接业务系统 RDS 的时候,需要 Doris 数据和业务数据保持一致,支持Upsert、Delete等操作
  • Duplicate (明细模型): 这个模型不保证数据唯一性(如果你数据重复导入两次就会重复),数据既没有主键,也没有聚合需求,一般情况下我们使用这个模型

聚合模型特点

一个正常的模型它肯定会把明细的数据存储在一个数据库中,也就是存在 Doris 中。但是因为 Doris 它最早是给凤巢的一个广告报表做的,广告报表有一个很大的特点,就是它只关心统计分析的结果,而不太关心明细的数据,所以 Doris 最早一代的数据模型,是一个聚合的模型。

聚合模型的特点就是将表中的列分为了Key和Value两种。 Key 就是数据的维度列,比如时间,地区等等。 Value 则是数据的指标列,比如点击量,花费等。每个指标列还会有自己的聚合函数,包括sum、min、max和bitmap_union 等。数据会根据维度列进行分组,并对指标列进行聚合。如下图:

通过上面的图我们可以看到,这是一个典型的用户信息和访问行为的事实表。 在一般星型模型中,用户信息和访问行为一般分别存放在维度表和事实表中。这里我们为了更加方便的解释 Doris 的数据模型,将两部分信息统一存放在一张表中。

这个表我们是按照:user_id,date,city,age,sex 来统计用户最后访问时间、用户总消费、用户最大停留时间、最小停留时间

表中的列按照是否设置了 IndexKeysType 是 AGG_KEYS 表示是聚合模型,分为 Key (维度列) 和 Value(指标列)。

这里我们 Key 列是 true 表示这个字段是 Key 列,false 的表示 Value 列,所有的 value 列我们在建表的时候指定他们的聚合类型(AggregationType)

上面这个对应的建表语句如下:

CREATE TABLE  example_tbl_02
(
    `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 1
PROPERTIES (
    "replication_allocation" = "tag.location.default: 1"
);

我们插入几条数据:

user_iddatecityagesexlast_visit_datecostmax_dwell_timemin_dwell_time
100002017-10-01北京2002017-10-01 06:00:00201010
100002017-10-01北京2002017-10-01 07:00:001522
100012017-10-01北京3012017-10-01 17:05:4522222
100022017-10-02上海2012017-10-02 12:59:1220055
100032017-10-02广州3202017-10-02 11:20:00301111
100042017-10-01深圳3502017-10-01 10:00:1510033
100042017-10-03深圳3502017-10-03 10:20:221166

上面这个数据中我们可以看到,前两行的数据 Key 是完全一致的,后面 Value 字段应该按照我们建表时候指定的聚合方式进行自动完成数据聚合,我们执行下面的语句插入数据,看看是否和我们预想的一致:

insert into example_tbl_02 values
(10000,"2017-10-01","北京",20,0,"2017-10-01 06:00:00",20,10,10),
(10000,"2017-10-01","北京",20,0,"2017-10-01 07:00:00",15,2,2),
(10001,"2017-10-01","北京",30,1,"2017-10-01 17:05:45",2,22,22),
(10002,"2017-10-02","上海",20,1,"2017-10-02 12:59:12",200,5,5),
(10003,"2017-10-02","广州",32,0,"2017-10-02 11:20:00",30,11,11),
(10004,"2017-10-01","深圳",35,0,"2017-10-01 10:00:15",100,3,3),
(10004,"2017-10-03","深圳",35,0,"2017-10-03 10:20:22",11,6,6);

通过下图来查看我们最后执行后的数据

聚合模型支持的聚合方式

当我们导入数据时,对于 Key 列相同的行会聚合成一行,而 Value 列会按照设置的 AggregationType 进行聚合。 AggregationType 目前有以下几种聚合方式和agg_state:

  1. SUM:求和,多行的 Value 进行累加。
  2. REPLACE:替代,下一批数据中的 Value 会替换之前导入过的行中的 Value。
  3. MAX:保留最大值。
  4. MIN:保留最小值。
  5. REPLACE_IF_NOT_NULL:非空值替换。和 REPLACE 的区别在于对于null值,不做替换,这种聚合方式适用于部分列更新
  6. HLL_UNION:HLL 类型的列的聚合方式,通过 HyperLogLog 算法聚合。
  7. BITMAP_UNION:BIMTAP 类型的列的聚合方式,进行位图的并集聚合。

聚合模型使用场景

我们知道需要再建表的时候指定数据模型,一旦创建表后期不能修改数据模型,如果你建表的时候没有指定数据模型默认是明细模型 (Duplicate Key).

  1. Aggregate 模型可以通过预聚合,极大地降低聚合查询时所需扫描的数据量和查询的计算量,非常适合有固定模式的报表类查询场景。但是该模型对 count(*) 查询很不友好。同时因为固定了 Value 列上的聚合方式,在进行其他类型的聚合查询时,需要考虑语意正确性
  2. 在数据分析领域,有很多需要对数据进⾏统计和汇总操作的场景,如需要分析⽹站和 APP 访问流量,统计⽤⼾的访问总时⻓,访问总次数。或者像⼚商需要为⼴告主提供⼴告点击的总流量,展⽰总量,消费统计等指标。在这些不需要保存明细数据的场景,只需要按照固定维度和指标进行聚合后的数据,通常可以使⽤聚合模型。
  3. 另外再部分列更新场景,如果用户既需要唯一主键约束,又需要更新部分列(例如将多张源表导入到一张 doris 表的情形),则可以考虑使用 Aggregate 模型,同时将非主键列的聚合类型设置为 REPLACE_IF_NOT_NULL,不过 Doris 2.0 版本 Unqiue Key 模型开始支持部分列更新,如果你没有开启行存情况下,大数据量表进行部分列更新对你的 CPU 消耗可能会很高,这个时候如果你没有特殊的需求,也可以使用聚合模型。Unique Key 模型其实也是聚合模型的一个特例。
  4. 聚合模型中不保存明细数据,如果你需要保存明细数据,就不适合使用聚合模型,建议选择Unqiue Key 或者 Duplicate Key 模型。

聚合模型限制

在聚合模型中,模型对外展现的,是最终聚合后的数据。也就是说,任何还未聚合的数据(比如说两个不同导入批次的数据),必须通过某种方式,以保证对外展示的一致性,特别是在聚合模型上做count计算,可能会导致结果不准确,针对这种情况我们怎么去解决。

第一种方式:增加一个 count 列,并且导入数据中,该列值恒为 1。则 select count(*) from table; 的结果等价于 select sum(count) from table;。而后者的查询效率将远高于前者。不过这种方式也有使用限制,就是用户需要自行保证,不会重复导入 AGGREGATE KEY 列都相同的行。否则,select sum(count) from table; 只能表述原始导入的行数,而不是 select count(*) from table; 的语义。

另一种方式:就是 将如上的 count 列的聚合类型改为 REPLACE,且依然值恒为 1。那么 select sum(count) from table; 和 select count(*) from table; 的结果将是一致的。并且这种方式,没有导入重复行的限制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1077311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法练习11——买卖股票的最佳时机 II

122. 买卖股票的最佳时机 II 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。 返回 你能获得…

【移植代码】matlab.engine报错、numpy+mkl安装、Qt platform plugin报错总结

文章目录 numpy报错numpy安装PyQt5报错matlab.engine无法加载确认配置版本进行配置 matlab文件路径缺失vscode无法debug3.7以下版本总结 今天的任务是复现师姐的代码,代码在服务器的环境下可以跑,而我要做的,就是将环境和源码配置好&#xff…

Python库学习(九):Numpy[续篇三]:数组运算

NumPy是用于数值计算的强大工具,提供了许多数组运算和数学函数,允许你执行各种操作,包括基本运算、统计计算、线性代数、元素级操作等 1.基本运算 1.1 四则运算 NumPy数组支持基本的四则运算(加法、减法、乘法和除法)…

mysql面试题31:一条SQL语句在MySQL中如何执行的

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:一条SQL语句在MySQL中如何执行的 以下是一条SQL语句在MySQL中的详细执行步骤: 语法分析:MySQL首先对SQL语句进行语法分析,检查SQL语句是否符合…

算法题:分发饼干(典型的贪心算法问题)

这个题目是一个典型的贪心算法问题,解决思路是排序双指针贪心法,先将两个数组分别排序,优先满足最小胃口的孩子。(本题完整题目附在了最后面) 代码如下: class Solution(object):def findContentChildren(…

如何使用 ONLYOFFICE API 转换办公文档格式

作者:天哥 上一期我们介绍了 ONLYOFFICE 的文档生成器API接口函数库。这一期我们继续介绍ONLYOFFICE 的文件转换API接口函数库。 为什么要使用 ONLYOFFICE 转换API ONLYOFFICE 转换 API 有助于转换大部分类型的Office文档:文本、表格、幻灯片、表单、P…

Visual Studio 2022新建项目时没有ASP.NET项目

一、Visual Studio 2022新建项目时没有ASP.NET项目 1、打开VS开发工具,选择工具菜单,点击“获取工具和功能” 2、选择“ASP.NET和Web开发”和把其他项目模板(早期版本)勾选上安装即可

C/C++实现简单高并发http服务器

基础知识 html,全称为html markup language,超文本标记语言。 http,全称hyper text transfer protocol,超文本传输协议。用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送…

网络安全(黑客)—小白自学

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防…

什么牌子洗地机最好最实用?口碑最好的洗地机排名

洗地机具备吸拖扫洗一体的特点,专治各种懒病,面对众多的洗地机,对于一些新手来说一时之间无从选择,今天笔者给大家介绍几款近期口碑比较好的家用洗地机。 洗地机洗地机合适的人群: 家里有小宝宝:一般2-10…

前端js八股文大全

一、js的数据类型 值类型(基本类型):数字(Number)、字符串(String)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol,大数值类型(BigInt) 引用数据类型:对象(Object)、数组…

mysql面试题30:什么是数据库连接池、应用程序和数据库建立连接的过程、为什么需要数据库连接池、你知道哪些数据库连接池

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:什么是数据库连接池? 数据库连接池是一种用于管理和复用数据库连接的技术。它是在应用程序和数据库之间建立一组数据库连接,并以池的形式存储起…

linux——多线程,线程控制

目录 一.POSIX线程库 二.线程创建 1.创建线程接口 2.查看线程 3.多线程的健壮性问题 4.线程函数参数传递 5.线程id和地址空间 三.线程终止 1.pthread_exit 2.pthread_cancel 四.线程等待 五.线程分离 一.POSIX线程库 站在内核的角度,OS只有轻量级进程…

TensorFlow入门(十六、识别模糊手写图片)

TensorFlow在图像识别方面,提供了多个开源的训练数据集,比如CIFAR-10数据集、FASHION MNIST数据集、MNIST数据集。 CIFAR-10数据集有10个种类,由6万个32x32像素的彩色图像组成,每个类有6千个图像。6万个图像包含5万个训练图像和1万个测试图像。 FASHION MNIST数据集由衣服、鞋子…

软件行业与就业(导师主讲)

在企业软件应用的整体架构体系中,有一部分被称为中间件,那么什么叫中间件? 中间件(Middleware)是指位于操作系统和应用程序之间的一层软件层,它提供了一组工具和服务,用于简化和增强企业软件应用…

Generative AI 新世界 | 文生图领域动手实践:预训练模型的微调

在上期文章,我们探讨了预训练模型的部署和推理,包括运行环境准备、角色权限配置、支持的主要推理参数、图像的压缩输出、提示工程 (Prompt Engineering)、反向提示 (Negative Prompting) 等内容。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资…

掌握C语言:开启编程世界的大门

掌握C语言:开启编程世界的大门 C语言编写的程序通常更高效,代码行数更少,适用于需要高性能的场景。掌握C语言还为你打开了学习其他高级编程语言的大门。C语言拥有庞大的开源社区和丰富的现成代码库,为你快速开发算法和函数提供了…

Nginx配置ssl证书(https证书)

Nginx配置ssl证书(https证书) 安装nginxNginx 的 SSL 模块安装下载Nginx 服务证书配置nginx.conf 安装nginx 搭建服务器,安装docker-compose https://blog.csdn.net/qq_33240556/article/details/124789530 安装docker-compose nginx https://blog.csdn.net/qq_33240556/artic…

做运维有前途吗?

不管男生女生,都不建议做运维!!就一个原因,性价比太低!需要会的东西多,没有一个统一的运维标准!你心目中的运维和别人心目中的运维,不是一个运维!也不建议做测试&#xf…