Doris数据模型

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

Apache Doris主要有3种数据模型:

  • 明细模型:Duplicate(重复,复制)模型,表中的Key值(类似关系模型中的主键)可以重复,和插入数据行一一对应。
  • 聚合模型:Aggregate(聚合,合计)模型,表中key值不重复,对于插入的数据数据按照key值对value值进行聚合函数合并。
  • 更新模型:UNIQUE 模型,聚合类型的特殊情况,key满足唯一性,最新插入的数据替换掉对应key的数据行。

1、明细模型(Duplicate)

1.1 说明
  • 明细模型是 DORIS 默认使用的数据模型
  • 该数据模型不会对导入的数据进行任何处理,保留导入的原始数据
  • 明细模型中, 可以指定部分的维度列为排序键; 而聚合模型和更新模型中, 排序键只能是全体维度列
  • 事实表中一类事务事实表,用于存储随业务不断产生的数据,一旦产生不再变化。例如交易流水、操作日志、出库入口记录等。这类需求,推荐使用明细模型。
1.2 样例测试

(1)表结构

ColumnNameTypeSortKeyComment
visitor_idINTY访问者ID
session_idINTY会话ID
client_ipCHAR(32)客户端IP
cityCHAR(32)城市

(2)建表语句

CREATE TABLE IF NOT EXISTS test.session_log
(
	visitor_id INT NOT NULL COMMENT "访问者ID",
    session_id INT NOT NULL COMMENT "SessionID",
	client_ip CHAR(32) NOT NULL COMMENT "客户端IP",
    city CHAR(32) NOT NULL COMMENT "城市"
)
DUPLICATE  KEY(visitor_id,session_id)
DISTRIBUTED BY HASH(visitor_id) BUCKETS 8
PROPERTIES ("replication_num"="1");

说明:建表语句中指定的 DUPLICATE KEY,只是用来指明底层数据按照那些列进行排序。

mysql> CREATE TABLE IF NOT EXISTS test.session_log
    -> (
    ->     visitor_id INT NOT NULL COMMENT "访问者ID",
    ->     session_id INT NOT NULL COMMENT "SessionID",
    ->     client_ip CHAR(32) NOT NULL COMMENT "客户端IP",
    ->     city CHAR(32) NOT NULL COMMENT "城市"
    -> )
    -> DUPLICATE  KEY(visitor_id,session_id)
    -> DISTRIBUTED BY HASH(visitor_id) BUCKETS 8
    -> PROPERTIES ("replication_num"="1");
Query OK, 0 rows affected (0.01 sec)

(3)插入测试数据

mysql> insert into test.session_log values(1,1,'192.163.9.101','shanghai');
Query OK, 1 row affected (0.05 sec)
{'label':'insert_c36ae31ecb8549ef-923daa82fda8dc78', 'status':'VISIBLE', 'txnId':'235'}

mysql> insert into test.session_log values(1,1,'192.163.9.101','shanghai');
Query OK, 1 row affected (0.06 sec)
{'label':'insert_fcad117e62e84ee7-908fc1e118b13368', 'status':'VISIBLE', 'txnId':'236'}

mysql> select * from test.session_log;
+------------+------------+---------------+----------+
| visitor_id | session_id | client_ip     | city     |
+------------+------------+---------------+----------+
|          1 |          1 | 192.163.9.101 | shanghai |
|          1 |          1 | 192.163.9.101 | shanghai |
+------------+------------+---------------+----------+
2 rows in set (0.03 sec)

mysql> insert into test.session_log values(1,2,'192.163.100.10','beijing');
Query OK, 1 row affected (0.04 sec)
{'label':'insert_fde1a90815f64a1d-a3e48a02ebce7bc6', 'status':'VISIBLE', 'txnId':'237'}

mysql> select * from test.session_log;
+------------+------------+----------------+----------+
| visitor_id | session_id | client_ip      | city     |
+------------+------------+----------------+----------+
|          1 |          1 | 192.163.9.101  | shanghai |
|          1 |          1 | 192.163.9.101  | shanghai |
|          1 |          2 | 192.163.100.10 | beijing  |
+------------+------------+----------------+----------+
3 rows in set (0.01 sec)

mysql> 

2、聚合模型(Aggregate)

2.1 说明
  • 聚合模型需要用户在建表时显式的将列分为 Key 列和 Value 列。
  • 该模型会自动的对Aggregate Key 相同的行,在 Value 列上进行聚合操作。
  • 目前支持SUM/MIN/MAX/REPLACE聚合操作。
    • SUM:求和,多行的 Value 进行累加。
    • REPLACE:替代,下一批数据中的 Value 会替换之前导入过的行中的 Value。
    • MAX:保留最大值。
    • MIN:保留最小值。
  • Aggregate模型可以提前聚合数据,适合报表和多维业务。
2.2 样例测试

(1)表结构

ColumnNameTypeAggregationTypeComment
user_idINT用户id
user_nameVARCHAR(32)用户名
last_visitDATETIMEREPLACE用户最后一次访问时间
max_dwell_timeINTMAX用户最大停留时间
min_dwell_timeINTMIN用户最小停留时间
pvBIGINTSUM点击量
dtDATE数据灌入日期时间

(2)建表语句

CREATE TABLE IF NOT EXISTS test.user_visit
(
    dt DATE NOT NULL COMMENT "数据灌入日期时间"
	user_id INT NOT NULL COMMENT "用户id",
    last_visit DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "最近访问时间",
    max_dwell_time INT MAX DEFAULT "0" COMMENT "用户最大停留时间",
    min_dwell_time INT MIN DEFAULT "99999" COMMENT "用户最小停留时间",
	pv BIGINT SUM DEFAULT "0" COMMENT "点击量"
)
AGGREGATE KEY(dt,user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 8
PROPERTIES ("replication_num"="1");
mysql> CREATE TABLE IF NOT EXISTS test.user_visit
    -> (
    ->     dt DATE NOT NULL COMMENT "数据灌入日期时间",
    ->     user_id INT NOT NULL COMMENT "用户id",
    ->     last_visit DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "最近访问时间",
    ->     max_dwell_time INT MAX DEFAULT "0" COMMENT "用户最大停留时间",
    ->     min_dwell_time INT MIN DEFAULT "99999" COMMENT "用户最小停留时间",
    ->     pv BIGINT SUM DEFAULT "0" COMMENT "点击量"
    -> )
    -> AGGREGATE KEY(dt,user_id)
    -> DISTRIBUTED BY HASH(user_id) BUCKETS 8
    -> PROPERTIES ("replication_num"="1");                                                                                                                     Query OK, 0 rows affected (0.03 sec)

mysql> 

(3)插入数据

mysql> insert into test.user_visit values("2021-08-31",1,"2021-08-30 10:20:22",2,1,1);
Query OK, 1 row affected (0.11 sec)
{'label':'insert_d275799ba2b842c5-aa89f42c97d28e12', 'status':'VISIBLE', 'txnId':'152'}

mysql> select * from test.user_visit;
+------------+---------+---------------------+----------------+----------------+------+
| dt         | user_id | last_visit          | max_dwell_time | min_dwell_time | pv   |
+------------+---------+---------------------+----------------+----------------+------+
| 2021-08-31 |       1 | 2021-08-30 10:20:22 |              2 |              1 |    1 |
+------------+---------+---------------------+----------------+----------------+------+
1 row in set (0.02 sec)

mysql>
mysql> insert into test.user_visit values("2021-08-31",1,"2021-08-30 11:30:22",10,0,2);
Query OK, 1 row affected (0.05 sec)
{'label':'insert_546f947cc80b4832-849e85afc78be4fc', 'status':'VISIBLE', 'txnId':'154'}

mysql> select * from test.user_visit;
+------------+---------+---------------------+----------------+----------------+------+
| dt         | user_id | last_visit          | max_dwell_time | min_dwell_time | pv   |
+------------+---------+---------------------+----------------+----------------+------+
| 2021-08-31 |       1 | 2021-08-30 11:30:22 |             10 |              0 |    3 |
+------------+---------+---------------------+----------------+----------------+------+
1 row in set (0.03 sec)

mysql>

3、更新模型(UNIQUE)

3.1 说明
  • 数据仓库中有一类累计快照事实表,覆盖一个完整的事务或产品的生命周期(无固定周期),通常有多个日期字段,记录生命周期的关键时间点,比如订单记录快照事实表有付款日期,发货日期和收货日期时间点。
  • 针对这种数据更新更新场景,传统处理方式是业务结束时间进行分区,未结束的业务结束日期统一定义为9999-12-31。Doris采用更新模型来满足这种需求。
  • 排序键满足唯一性约束, 成为主键
3.2 样例测试

(1)表结构

ColumnNameTypeIsKeyComment
order_idBIGINTY订单id
order_statusTINYINT订单状态
user_idvarchar(32)用户ID
order_amountDOUBLE订单金额

(2)建表语句

CREATE TABLE IF NOT EXISTS test.user_order
(
	order_id BIGINT NOT NULL COMMENT "订单ID",
    order_status TINYINT COMMENT "订单状态",
	user_id varchar(32) NOT NULL COMMENT "用户ID",
    order_amount DOUBLE COMMENT "订单金额"
)
UNIQUE KEY(order_id)
DISTRIBUTED BY HASH(order_id) BUCKETS 8
PROPERTIES ("replication_num"="1");

(3)插入数据

mysql> CREATE TABLE IF NOT EXISTS test.user_order                                                                                                                  -> (
    ->     order_id BIGINT NOT NULL COMMENT "订单ID",
    ->     order_status TINYINT COMMENT "订单状态",
    ->     user_id varchar(32) NOT NULL COMMENT "用户ID",
    ->     order_amount DOUBLE COMMENT "订单金额"
    -> )
    -> UNIQUE KEY(order_id)
    -> DISTRIBUTED BY HASH(order_id) BUCKETS 8
    -> PROPERTIES ("replication_num"="1");
Query OK, 0 rows affected (0.02 sec)

mysql> insert into  test.user_order values(1001,1,'hadron',98.5);
Query OK, 1 row affected (0.06 sec)
{'label':'insert_5fabf4aca7074801-b5156a1523160ec9', 'status':'VISIBLE', 'txnId':'238'}

mysql> insert into  test.user_order values(1001,2,'hadron',98.5);
Query OK, 1 row affected (0.04 sec)
{'label':'insert_58b051467da94422-b49c606b6f54f1f3', 'status':'VISIBLE', 'txnId':'239'}

mysql> select * from test.user_order;
+----------+--------------+---------+--------------+
| order_id | order_status | user_id | order_amount |
+----------+--------------+---------+--------------+
|     1001 |            2 | hadron  |         98.5 |
+----------+--------------+---------+--------------+
1 row in set (0.03 sec)

mysql> 

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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模型,以满足业务需求并获得良好的性能和可扩展性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值