Doris系列5-Doris数据模型

基本概念

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

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

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

  1. Aggregate
  2. Uniq
  3. Duplicate

一. Aggregate 模型

1.1 Aggregate 模型介绍

当我们导入数据时,对于 Key 列相同的行会聚合成一行,而 Value 列会按照设置的 AggregationType 进行聚合。

AggregationType 目前有以下四种聚合方式:

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

1.2 案例一:导入数据聚合

测试数据:

-- create table
use example_db;
CREATE TABLE IF NOT EXISTS example_tb1
(
    `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 10
PROPERTIES("replication_num" = "1");


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

Doris的导入也很快,一条数据很快的就导入。
image.png

通过对比可以看到,user_id为10000的数据做了聚合。
image.png

1.3 案例2:保留明细数据

代码:

use example_db;
CREATE TABLE IF NOT EXISTS example_tb2
(
    `user_id` LARGEINT NOT NULL COMMENT "用户id",
    `date` DATE NOT NULL COMMENT "数据灌入日期时间",
    `timestamp` DATETIME 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`)
DISTRIBUTED BY HASH(user_id) BUCKETS 10
PROPERTIES("replication_num" = "1");


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

image.png

二. Uniq 模型

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

源数据:
image.png

Doris端:
此时假设需要保存源端所有的数据
建表的时候user_id、user_name为Unique Key,其余列默认即可。
建表的时候user_id、user_name两列为key,其余的都是replace类型,就可以满足唯一模型。

-- UNIQUE KEY
CREATE TABLE IF NOT EXISTS expamle_tb3
(
    `user_id` LARGEINT NOT NULL COMMENT "用户id",
    `username` VARCHAR(50) NOT NULL COMMENT "用户昵称",
    `city` VARCHAR(20) COMMENT "用户所在城市",
    `age` SMALLINT COMMENT "用户年龄",
    `sex` TINYINT COMMENT "用户性别",
    `phone` LARGEINT COMMENT "用户电话",
    `address` VARCHAR(500) COMMENT "用户地址",
    `register_time` DATETIME COMMENT "用户注册时间"
)
UNIQUE KEY(`user_id`, `username`)
DISTRIBUTED BY HASH(user_id) BUCKETS 10
PROPERTIES("replication_num" = "1");

-- AGGREGATE KEY
CREATE TABLE IF NOT EXISTS expamle_tb4
(
    `user_id` LARGEINT NOT NULL COMMENT "用户id",
    `username` VARCHAR(50) NOT NULL COMMENT "用户昵称",
    `city` VARCHAR(20) REPLACE COMMENT "用户所在城市",
    `age` SMALLINT REPLACE COMMENT "用户年龄",
    `sex` TINYINT REPLACE COMMENT "用户性别",
    `phone` LARGEINT REPLACE COMMENT "用户电话",
    `address` VARCHAR(500) REPLACE COMMENT "用户地址",
    `register_time` DATETIME REPLACE COMMENT "用户注册时间"
)
AGGREGATE KEY(`user_id`, `username`)
DISTRIBUTED BY HASH(user_id) BUCKETS 10
PROPERTIES("replication_num" = "1");

image.png

三. Duplicate 模型

在某些多维分析场景下,数据既没有主键,也没有聚合需求。因此,我们引入 Duplicate 数据模型来满足这类需求。

源数据:
image.png

建表语句如下:

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” 只是用以明确表示所用的数据模型。关于 “Sorted Column”的更多解释,可以参阅前缀索引小节)。在 DUPLICATE KEY 的选择上,我们建议适当的选择前 2-4 列就可以。

四. 数据模型的选择建议

因为数据模型在建表时就已经确定,且无法修改。所以,选择一个合适的数据模型非常重要。

  1. Aggregate 模型可以通过预聚合,极大地降低聚合查询时所需扫描的数据量和查询的计算量,非常适合有固定模式的报表类查询场景。但是该模型对 count(*) 查询很不友好。同时因为固定了 Value 列上的聚合方式,在进行其他类型的聚合查询时,需要考虑语意正确性。

  2. Uniq 模型针对需要唯一主键约束的场景,可以保证主键唯一性约束。但是无法利用 ROLLUP 等预聚合带来的查询优势(因为本质是 REPLACE,没有 SUM 这种聚合方式)。

  3. Duplicate 适合任意维度的 Ad-hoc 查询。虽然同样无法利用预聚合的特性,但是不受聚合模型的约束,可以发挥列存模型的优势(只读取相关列,而不需要读取所有 Key 列)。

参考:

  1. https://doris.apache.org/master/zh-CN/getting-started/data-model-rollup.html#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值