一文看懂Doris数据模型(含样例,建议收藏)

本文详细介绍了ApacheDoris数据库中的Duplicate、Aggregate和Unique三种数据模型的应用场景,包括数据去重策略、聚合方式以及写时合并和读时合并的优劣。通过示例展示了如何创建和使用这些模型,并强调了写时合并作为Unique模型的推荐实现方式。
摘要由CSDN通过智能技术生成

1、三种模型场景说明总结

模型应用场景说明
Duplicate
(重复)
适用于那些需要完全保留原始导入数据的场景,即使两行数据完全相同也会保留。
适用于既没有聚合需求,又没有主键唯一性约束的原始数据。
这种模型在处理那些需要保留原始数据详细信息的场景时非常有用,例如日志分析、审计追踪等。
Aggregate
(聚合)
对于 Key 列(维度列)相同的行会聚合成一行,而 Value 列(指标列)会按照设置的 AggregationType 进行聚合。最大的缺点就是无法查询明细数据。
通过预聚合,及大地减少查询时所需扫描和计算的数据,适合固定模式的报表类查询场景。
Unique
(唯一)
业务更加关注Key的唯一性,即主键唯一性约束。
这种模型在处理那些需要精确匹配唯一标识的数据时非常有用,例如用户ID、订单号等。



2、补充说明:

2.1、AggregationType 目前有以下几种聚合方式和agg_state:
  • SUM:求和,多行的 Value 进行累加。
  • REPLACE:替代,下一批数据中的 Value 会替换之前导入过的行中的 Value。
  • MAX:保留最大值。
  • MIN:保留最小值。
  • REPLACE_IF_NOT_NULL:非空值替换。和 REPLACE 的区别在于对于null值,不做替换。
  • HLL_UNION:HLL 类型的列的聚合方式,通过 HyperLogLog 算法聚合。
  • BITMAP_UNION:BIMTAP 类型的列的聚合方式,进行位图的并集聚合。

如果这几种聚合方式无法满足需求,则可以选择使用agg_state类型。


2.2、Unique模型提供了两种实现方式:
  • 读时合并(merge-on-read)。在读时合并实现中,用户在进行数据写入时不会触发任何数据去重相关的操作,所有数据去重的操作都在查询或者compaction时进行。因此,读时合并的写入性能较好,查询性能较差,同时内存消耗也较高。
  • 写时合并(merge-on-write)。在1.2版本中,我们引入了写时合并实现,该实现会在数据写入阶段完成所有数据去重的工作,因此能够提供非常好的查询性能。

自2.0版本起,写时合并已经非常成熟稳定, 由于其优秀的查询性能,我们推荐大部分用户选择该实现。自2.1版本其,写时合并成为Unique模型的默认实现



3、场景体验

准备:创建数据库
CREATE DATABASE IF NOT EXISTS example_db;
3.1、聚合(Aggregate)模型
CREATE TABLE IF NOT EXISTS example_db.example_tbl_agg
(
    `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"
);


insert into example_db.example_tbl_agg 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);

#分析
按照`user_id`, `date`, `city`, `age`, `sex`相同的进行聚合,包含:REPLACE,MAX,MIN以及SUM

doris4.png

3.2、唯一(Unique)模型
CREATE TABLE IF NOT EXISTS example_db.example_tbl_unique
(
    `user_id` LARGEINT NOT NULL COMMENT "用户id",
    `username` VARCHAR(50) NOT NULL COMMENT "用户昵称",
    `city` VARCHAR(20) COMMENT "用户所在城市",
    `age` SMALLINT COMMENT "用户年龄",
    `sex` TINYINT COMMENT "用户性别",
    `register_time` DATETIME COMMENT "用户注册时间"
)
UNIQUE KEY(`user_id`, `username`)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);

#插入默认数据
insert into example_db.example_tbl_unique values
(10000,"张三","北京",20,0,"2017-10-01 06:00:00"),
(10004,"陈九","深圳",35,0,"2017-10-01 10:00:15"),
(10001,"李四","北京",30,1,"2017-10-01 17:05:45"),
(10002,"王五","上海",20,1,"2017-10-02 12:59:12"),
(10003,"赵六","广州",32,0,"2017-10-02 11:20:00");

#插入新数据,感受变化
insert into example_db.example_tbl_unique values
(10001,"李四G","北京",30,1,"2017-10-01 17:05:45"),
(10000,"张三","北京F",20,0,"2017-10-01 07:00:00"),
(10004,"陈九","深圳I",35,0,"2017-10-03 10:20:22");

#分析
110001(李四)用户,由于username发生变化,不符合UNIQUE KEY,所以被认为是2条数据。
21000010004用户,符合UNIQUE KEY,最后保留的是最新数据。

doris1.png
doris2.png

3.3、重复(Duplicate)模型
CREATE TABLE IF NOT EXISTS example_db.example_tbl_duplicate
(
    `user_id` LARGEINT NOT NULL COMMENT "用户id",
    `username` VARCHAR(50) NOT NULL COMMENT "用户昵称",
    `city` VARCHAR(20) COMMENT "用户所在城市",
    `age` SMALLINT COMMENT "用户年龄",
    `sex` TINYINT COMMENT "用户性别",
    `register_time` DATETIME COMMENT "用户注册时间"
)
DUPLICATE KEY(`user_id`, `username`)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);

insert into example_db.example_tbl_duplicate values
(10000,"张三","北京",20,0,"2017-10-01 06:00:00"),
(10004,"陈九","深圳",35,0,"2017-10-01 10:00:15"),
(10001,"李四","北京",30,1,"2017-10-01 17:05:45"),
(10002,"王五","上海",20,1,"2017-10-02 12:59:12"),
(10003,"赵六","广州",32,0,"2017-10-02 11:20:00");

insert into example_db.example_tbl_duplicate values
(10000,"张三","北京",20,0,"2017-10-01 06:00:00"),
(10004,"陈九","深圳",35,0,"2017-10-01 10:00:15"),
(10001,"李四","北京",30,1,"2017-10-01 17:05:45"),
(10002,"王五","上海",20,1,"2017-10-02 12:59:12"),
(10003,"赵六","广州",32,0,"2017-10-02 11:20:00");

#分析
为了看出明显效果(请忽略业务的合理性),duplicate模型使用了预unique一样的表结构,发现插入重复的数据也是会完全保留的。

doris3.png

更多信息可参见官方文档地址:https://doris.apache.org/zh-CN/docs/data-table/data-model



往期精彩内容推荐

【快捷部署】001_Doris(2.0.3)
易经智慧解码数字化转型:象数理视角下的未来探索
数字化转型对企业有什么意义
数字化时代的利器:数仓助力企业破局突围

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、付费专栏及课程。

余额充值