百度自研的交互式 SQL 数据仓库Doris简介

前言

Doris是百度自研的交互式 SQL 数据仓库,其前身是 Palo ,Palo 是百度自研的基于 MPP 的交互式 SQL 数据仓库,主要用于解决报表和多维分析。现简单介绍Doris的数据模型。

基本概念

Doirs与传统的关系库相同,都是以表(Table)的形式存储数据,其中一张表包括行Row和列Column。
Column分为两类:Key和Value,从业务角度看,Key和Value可以分别对应维度和指标列。
Doris主要包括三种数据模型:Aggregate、Uniq和Duplicate,也是这篇文章主要介绍的。

Aggregate 模型(聚合模型)

假设业务有如下数据表
ColumnNameTypeAggregationTypeComment
user_idLARGEINT用户id
dateDATE数据灌入日期
cityVARCHAR(20)用户所在城市
ageSMALLINT用户年龄
sexTINYINT用户性别
last_visit_dateDATETIMEREPLACE用户最后一次访问时间
costBIGINTSUM用户总消费
max_dwell_timeINTMAX用户最大停留时间
min_dwell_timeINTMIN用户最小停留时间

表中的列没有设置Aggregation Type的列称为Key,而设置了Aggregation Type的称为Value。
目前共有四种Aggregation Type聚合类型,如下所示:

1 sum:求和,多行value累加
2 replace:替代,后插入的Value替代之前的Value
3 max:保留Value最大值
4 min:保留Value最小值

原理:实际导入数据中相当于会根据Key进行Group By,然后Value值输出相应Aggregation Type的结果。与使用聚合函数后的sql相同,明细数据会丢失,只保留聚合后的结果。如果想要保留明细数据,可以加入Key字段Timestamp从而保证每一行的Key都不相同。

Uniq模型(唯一主键)

在某些多维分析场景下,用户更关注的是如何保证 Key 的唯一性,即如何获得 Primary Key 唯一性约束。因此Doris引入了 Uniq 的数据模型。该模型本质上是聚合模型的一个特例,也是一种简化的表结构表示方式。

假设业务有如下数据表
ColumnNameTypeIsKeyComment
user_idBIGINTYes用户id
usernameVARCHAR(50)Yes用户昵称
cityVARCHAR(20)No用户所在城市
ageSMALLINTNo用户年龄
sexTINYINTNo用户性别
phoneLARGEINTNo用户电话
addressVARCHAR(500)No用户住址
register_timeDATETIMENo用户注册时间

而这个表结构,完全同等于以下使用聚合模型描述的表结构:

ColumnNameTypeAggregationTypeComment
user_idBIGINT用户id
usernameVARCHAR(50)用户昵称
cityVARCHAR(20)REPLACE用户所在城市
ageSMALLINTREPLACE用户年龄
sexTINYINTREPLACE用户性别
phoneLARGEINTREPLACE用户电话
addressVARCHAR(500)REPLACE用户住址
register_timeDATETIMEREPLACE用户注册时间

Duplicate 模型(冗余模型)

在某些多维分析场景下,数据既没有主键,也没有聚合需求。例如常见的日志表log。

假设业务有如下数据表
ColumnNameTypeSortKeyComment
timestampDATETIMEYes日志时间
typeINTYes日志类型
error_codeINTYes错误码
error_msgVARCHAR(1024)No错误详细信息
op_idBIGINTNo负责人id
op_timeDATETIMENo处理时间
建表语句如下:
CREATE TABLE IF NOT EXISTS example_db.expamle_tbl
(
    `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`)
... /* 省略 Partition 和 Distribution 信息 */
;

这种数据模型区别于 Aggregate 和 Uniq 模型。数据完全按照导入文件中的数据进行存储,不会有任何聚合。即使两行数据完全相同,也都会保留。 而在建表语句中指定的 DUPLICATE KEY,只是用来指明底层数据按照那些列进行排序。(更贴切的名称应该为 “Sorted Column”,这里取名 “DUPLICATE KEY” 只是用以明确表示所用的数据模型。

reference
https://github.com/apache/incubator-doris/wiki/Data-Model%2C-Rollup-%26-Prefix-Index

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值