Doris 数据模型

目录

基本概念

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 数据入库时间,精确到日期

你可能感兴趣的:(OLAP)