Doris 基础与数据模型划分

发布时间 2023-07-31 11:03:58作者: Xianhao

端口

image

启动

FE 启动

启动 bin/start_fe.sh --daemon

BE 启动

在 FE 中添加所有 BE 节点:

连接FE

./mysql-client -h fe_host -P query_port -uroot

其中 fe_host 为 FE 所在节点 ip;
query_port 在 fe/conf/fe.conf 中的;默认使用 root 账户,无密码登录。

添加BE

ALTER SYSTEM ADD BACKEND "be_host:heartbeat-service_port";

其中 be_host 为 BE 所在节点 ip;
heartbeat_service_port 在 be/conf/be.conf 中。

启动BE

bin/start_be.sh --daemon

Aggregate模型

当导入数据时,对于 Key 列相同的行会聚合成一行,而 Value 列会按照设置的 AggregationType 进行聚合。 AggregationType 目前有以下四种聚合方式:

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

使用方式

建表时指定

AGGREGATE KEY(column1,column2)

Unique模型

用来实现唯一性约束

使用方式

UNIQUE KEY(column1,column2)

其他注意

写时合并,从1.2.0开始支持,在建表时设置properties
"enable_unique_key_merge_on_write" = "true"

Duplicate模型

这种数据模型适用于既没有聚合需求,又没有主键唯一性约束的原始数据的存储。

数据划分

在 Doris 的存储引擎中,用户数据被水平划分为若干个数据分片(Tablet,也称作数据分桶)。每个 Tablet 包含若干数据行。各个 Tablet 之间的数据没有交集,并且在物理上是独立存储的。

多个 Tablet 在逻辑上归属于不同的分区(Partition)。一个 Tablet 只属于一个 Partition。而一个 Partition 包含若干个 Tablet。因为 Tablet 在物理上是独立存储的,所以可以视为 Partition 在物理上也是独立。Tablet 是数据移动、复制等操作的最小物理存储单元。

若干个 Partition 组成一个 Table。Partition 可以视为是逻辑上最小的管理单元。数据的导入与删除,仅能针对一个 Partition 进行。

分区建表写法

注意事项

  • Partition 列可以指定一列或多列,分区列必须为 KEY 列。多列分区的使用方式在后面 多列分区 小结介绍。
  • 不论分区列是什么类型,在写分区值时,都需要加双引号。
  • 分区数量理论上没有上限。
  • 当不使用 Partition 建表时,系统会自动生成一个和表名同名的,全值范围的 Partition。该 Partition 对用户不可见,并且不可删改。
  • 创建分区时不可添加范围重叠的分区。

range分区

PARTITION BY RANGE(col1[, col2, ...])  
(  
PARTITION partition_name1 VALUES LESS THAN MAXVALUE|("value1", "value2", ...),  
PARTITION partition_name2 VALUES LESS THAN MAXVALUE|("value1", "value2", ...)  
)

PARTITION BY RANGE(col1[, col2, ...])  
(  
PARTITION partition_name1 VALUES [("k1-lower1", "k2-lower1", "k3-lower1",...), ("k1-upper1", "k2-upper1", "k3-upper1", ...)),  
PARTITION partition_name2 VALUES [("k1-lower1-2", "k2-lower1-2", ...), ("k1-upper1-2", MAXVALUE, ))  
)

PARTITION BY RANGE(col)
(
   FROM ("2000-11-14") TO ("2021-11-14") INTERVAL 1 YEAR,
   FROM ("2021-11-14") TO ("2022-11-14") INTERVAL 1 MONTH,
   FROM ("2022-11-14") TO ("2023-01-03") INTERVAL 1 WEEK,
   FROM ("2023-01-03") TO ("2023-01-14") INTERVAL 1 DAY
)

list分区

PARTITION BY LIST(`city`)  
(  
PARTITION `p_cn` VALUES IN ("Beijing", "Shanghai", "Hong Kong"),  
PARTITION `p_usa` VALUES IN ("New York", "San Francisco"),  
PARTITION `p_jp` VALUES IN ("Tokyo")  
)