登 录
注 册
< 数 据 库
MySQL
ClickHouse
ES
Doris
MongoDB
Redis
其他DB
Doris概述
Doris扩容和缩容
Doris数据模型
Doris优化
热门推荐>>>
中台架构
中台建设与架构
Hadoop
源码分析-NN启动(三)
HBase
HBased对接Hive
Linux
Nginx高可用
Python
数据导出工具
Flink
3分钟搭建Flink SQL测试环境
Kafka
Kafka对接Flume
深度学习
卷积神经网络
数据结构与算法
选择合适的算法
MySQL
数据备份恢复
计算机系统
信号量同步线程
Hive
Hive调优参数大全
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
虚拟化
内存虚拟化概述
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
当前位置:
首页
>>
Doris
>>
Doris数据模型
Doris数据模型
2023-09-10 11:59:03 星期日 发表于北京 阅读:553
![](/static/images/article_images/1694331426.542232.jpeg) 在Doris 中,数据都以关系表(Table)的形式进行逻辑上的描述。 #### Row & Column 一张表包括行(Row)和列(Column)。Row 即用户的一行数据。Column 用于描述一行数据中不同的字段。 **默认数据模型** Column 只分为排序列和非排序列。存储引擎会按照排序列对数据进行排序存储,并建立稀疏索引,以便在排序数据上进行快速查找。 **聚合模型** Column 可以分为两大类:Key 和 Value。从业务角度看,Key 和Value 可以分别对应维度列和指标列。从聚合模型的角度来说,Key 列相同的行,会聚合成一行。其中 Value 列的聚合方式由用户在建表时指定。 #### Partition & Tablet 在 Doris 的存储引擎中,用户数据首先被划分成若干个分区(Partition),划分的规则通常是按照用户指定的分区列进行范围划分,比如按时间划分。而在每个分区内,数据被进一步的按照 Hash 的方式分桶,分桶的规则是要找用户指定的分桶列的值进行 Hash 后分桶。每个分桶就是一个数据分片(Tablet),也是数据划分的最小逻辑单元。 1. 1.Tablet 之间的数据是没有交集的,独立存储的。Tablet 也是数据移动、复制等操作的最小物理存储单元。 2. 2.Partition 可以视为是逻辑上最小的管理单元。数据的导入与删除,都可以或仅能针对一个 Partition 进行。 #### 建表语法 使用 CREATE TABLE 命令建立一个表(Table)。更多详细参数可以查看:`HELP CREATE TABLE;` ```sql CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [database.]table_name (column_definition1[, column_definition2, ...] [, index_definition1[, index_definition12,]]) [ENGINE = [olap|mysql|broker|hive]] [key_desc] [COMMENT "table comment"]; [partition_desc] [distribution_desc] [rollup_index] [PROPERTIES ("key"="value", ...)] [BROKER PROPERTIES ("key"="value", ...)]; ``` Doris 的建表是一个同步命令,命令返回成功,即表示建表成功。Doris 支持支持单分区和复合分区两种建表方式。 **复合分区**:既有分区也有分桶 第一级称为 Partition,即分区。用户可以指定某一维度列作为分区列(当前只支持整型和时间类型的列),并指定每个分区的取值范围。 第二级称为 Distribution,即分桶。用户可以指定一个或多个维度列以及桶数对数据进行 HASH 分布。 **单分区**:只做 HASH 分布,即只分桶。 #### 数据划分 ##### 列定义 *以 AGGREGATE KEY 数据模型为例进行说明* 列的基本类型,可以通过在 mysql-client 中执行` HELP CREATE TABLE; `查看 AGGREGATE KEY 数据模型中,所有没有指定聚合方式(SUM、REPLACE、MAX、MIN)的列视为 Key 列。而其余则为 Value 列。 定义列时,可参照如下建议: >➢ Key 列必须在所有 Value 列之前。 ➢ 尽量选择整型类型。因为整型类型的计算和查找比较效率远高于字符串。 ➢ 对于不同长度的整型类型的选择原则,遵循够用即可。 ➢ 对于 VARCHAR 和 STRING 类型的长度,遵循 够用即可。 ➢ 所有列的总字节长度(包括 Key 和 Value)不能超过 100KB。 ##### 分区与分桶 Doris 支持两层的数据划分。 第一层是 Partition,支持 Range 和 List 的划分方式 第二层是 Bucket(Tablet),仅支持 Hash 的划分方式 也可以仅使用一层分区。使用一层分区时,只支持 Bucket 划分 ###### Partition ➢ Partition 列可以指定一列或多列,分区类必须为 KEY 列 ➢ 不论分区列是什么类型,在写分区值时,都需要加双引号 ➢ 分区数量理论上没有上限 ➢ 当不使用 Partition 建表时,系统会自动生成一个和表名同名的,全值范围的Partition。该 Partition 对用户不可见,并且不可删改 ###### Range 分区 分区列通常为时间列,以方便的管理新旧数据。不可添加范围重叠的分区。Partition 指定范围的方式 `VALUES LESS THAN (...) `仅指定上界,系统会将前一个分区的上界作为该分区的下界,生成一个左闭右开的区间。分区的删除不会改变已存在分区的范围。删除分区可能出现空洞。 `VALUES [...) `指定同时指定上下界,生成一个左闭右开的区间。 ###### List 分区 分区列支持` BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, DATE,DATETIME, CHAR, VARCHAR `数据类型,分区值为枚举值。只有当数据为目标分区枚举值其中之一时,才可以命中分区。不可添加范围重叠的分区。 #### 使用复合分区的场景 (1)有时间维度或类似带有有序值的维度,可以以这类维度列作为分区列。分区粒度可以根据导入频次、分区数据量等进行评估 (2)历史数据删除需求:如有删除历史数据的需求(比如仅保留最近 N 天的数据)。使用复合分区,可以通过删除历史分区来达到目的。也可以通过在指定分区内发送 DELETE语句进行数据删除 (3)解决数据倾斜问题:每个分区可以单独指定分桶数量。如按天分区,当每天的数据量差异很大时,可以通过指定分区的分桶数,合理划分不同分区的数据,分桶列建议选择区分度大的列