Doris 数据模型

Doris 数据模型包括 Aggregate(聚合模型)、Uniq(唯一主键)和 Duplicate(冗余模型)。Aggregate 模型通过聚合操作减少数据量,如 SUM、REPLACE、MAX 和 MIN。在导入数据时,相同 Key 的行会被聚合。Uniq 模型保证 Key 的唯一性,相当于聚合模型的 REPLACE 特例。Duplicate 模型则无聚合和主键约束,用于存储原始数据。ROLLUP 功能允许创建基于 Base 表的更粗粒度聚合数据,提高查询效率。
摘要由CSDN通过智能技术生成

目录

基本概念

Aggregate 模型(聚合模型)

示例1:导入数据聚合

示例2:保留明细数据

示例3:导入数据与已有数据聚合

Uniq 模型(唯一主键)

Duplicate 模型(冗余模型)

ROLLUP

基本概念

前缀索引与 ROLLUP

ROLLUP 的几点说明

聚合模型的局限性

Duplicate 模型

数据模型的选择建议


基本概念

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

Column 可以分为两大类:Key 和 Value。从业务角度看,Key 和 Value 可以分别对应维度列和指标列。

Doris 的数据模型主要分为3类:

  • Aggregate
  • Uniq
  • Duplicate

下面我们分别介绍。

Aggregate 模型(聚合模型)

我们以实际的例子来说明什么是聚合模型,以及如何正确的使用聚合模型。

示例1:导入数据聚合

假设业务有如下数据表模式:

ColumnName Type AggregationType Comment
user_id LARGEINT   用户id
date DATE   数据灌入日期
city VARCHAR(20)   用户所在城市
age SMALLINT   用户年龄
sex TINYINT   用户性别
last_visit_date DATETIME REPLACE 用户最后一次访问时间
cost BIGINT SUM 用户总消费
max_dwell_time INT MAX 用户最大停留时间
min_dwell_time INT MIN 用户最小停留时间

如果转换成建表语句则如下(省略建表语句中的 Partition 和 Distribution 信息)

CREATE TABLE IF NOT EXISTS example_db.expamle_tbl
(
	`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`, `timestamp`, `city`, `age`, `sex`)
... /* 省略 Partition 和 Distribution 信息 */
;

可以看到,这是一个典型的用户信息和访问行为的事实表。

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

表中的列按照是否设置了 AggregationType,分为 Key (维度列) 和 Value(指标列)。没有设置 AggregationType 的,如 user_iddateage ... 等称为 Key,而设置了 AggregationType 的称为 Value

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

  1. SUM:求和,多行的 Value 进行累加。
  2. REPLACE:替代,下一批数据中的 Value 会替换之前导入过的行中的 Value。
  3. MAX:保留最大值。
  4. MIN:保留最小值。

假设我们有以下导入数据(原始数据):

user_id date city age sex last_visit_date cost max_dwell_time min_dwell_time
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

我们假设这是一张记录用户访问某商品页面行为的表。我们以第一行数据为例,解释如下:

数据 说明
10000 用户id,每个用户唯一识别id
2017-10-01 数据入库时间,精确到日期
北京 用户所在城市
20 用户年龄
0 性别男(1 代表女性)
2017-10-01 06:00:00 用户本次访问该页面的时间,精确到秒
20 用户本次访问产生的消费
10 用户本次访问,驻留该页面的时间
10 用户本次访问,驻留该页面的时间(冗余)

那么当这批数据正确导入到 Doris 中后,Doris 中最终存储如下:

user_id date city age sex last_visit_date cost max_dwell_time min_dwell_time
10000 2017-10-01 北京 20 0 2017-10-01 07:00:00 35 10 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

可以看到,用户 10000 只剩下了一行聚合后的数据。而其余用户的数据和原始数据保持一致。这里先解释下用户 10000 聚合后的数据:

前5列没有变化,从第6列 last_visit_date 开始:

  • 2017-10-01 07:00:00:因为 last_visit_date 列的聚合方式为 REPLACE,所以 2017-10-01 07:00:00 替换了 2017-10-01 06:00:00 保存了下来。

    注:在同一个导入批次中的数据,对于 REPLACE 这种聚合方式,替换顺序不做保证。如在这个例子中,最终保存下来的,也有可能是 2017-10-01 06:00:00。而对于不同导入批次中的数据,可以保证,后一批次的数据会替换前一批次。

  • 35:因为 cost 列的聚合类型为 SUM,所以由 20 + 15 累加获得 35。

  • 10:因为 max_dwell_time 列的聚合类型为 MAX,所以 10 和 2 取最大值,获得 10。

  • 2:因为 min_dwell_time 列的聚合类型为 MIN,所以 10 和 2 取最小值,获得 2。

经过聚合,Doris 中最终只会存储聚合后的数据。换句话说,即明细数据会丢失,用户不能够再查询到聚合前的明细数据了。

示例2:保留明细数据

接示例1,我们将表结构修改如下:

ColumnName Type AggregationType Comment
user_id LARGEINT  </
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Doris是一个开源的分布式数据仓库,支持实数据分析和查询。在选择Doris数据模型,需要考虑以下几个因素: 1. 数据结构和查询需求: Doris支持两种主要的数据模型:OLAP(Online Analytical Processing)和OLTP(Online Transaction Processing)。OLAP模型适用于复杂的分析查询,支持大规模聚合、多维分析和快速查询。OLTP模型适用于实的事务处理,支持高并发、低延迟的读写操作。根据实际的业务需求和查询场景,选择适合的数据模型。 2. 数据规模和性能要求: Doris可以处理大规模的数据集,并提供高性能的查询和分析能力。如果需要处理海量数据,并且对查询性能有较高的要求,可以选择Doris的OLAP模型。它使用列存储和多维索引等技术,可以实现更快速的查询响应。 3. 数据更新频率: 如果数据更新频率较高,例如每秒或每分钟都会有大量的数据写入,那么OLTP模型可能更适合。它支持实的数据写入和查询,适合需要快速响应和实分析的场景。而如果数据更新频率较低,以批量或定期方式进行更新,OLAP模型可能更适合。 4. 数据一致性和可靠性: Doris提供了强一致性和高可靠性的数据存储和处理能力。根据业务的要求,选择适当的数据模型以确保数据的一致性和可靠性。 总结: 在选择Doris数据模型,需要考虑数据结构和查询需求、数据规模和性能要求、数据更新频率以及数据一致性和可靠性等因素。根据实际情况选择适合的OLAP或OLTP模型,以满足业务需求并获得良好的性能和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值