Doris 数据模型-Aggregate 模型(十)

Doris 的数据模型主要分为 3 类:Aggregate、Uniq、Duplicate

表中的列按照是否设置了 AggregationType,分为 Key(维度列)和 Value(指标列)。没有设置 AggregationType 的称为 Key,设置了 AggregationType 的称为 Value。

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

  • SUM:求和,多行的 Value 进行累加。

  • REPLACE:替代,下一批数据中的 Value 会替换之前导入过的行中的 Value。

  • REPLACE_IF_NOT_NULL :当遇到 null 值则不更新。

  • MAX:保留最大值。

  • MIN:保留最小值。

数据的聚合,在 Doris 中有如下三个阶段发生:

(1)每一批次数据导入的 ETL 阶段。该阶段会在每一批次导入的数据内部进行聚合。

(2)底层 BE 进行数据 Compaction 的阶段。该阶段,BE 会对已导入的不同批次的数据进行进一步的聚合。

(3)数据查询阶段。在数据查询时,对于查询涉及到的数据,会进行对应的聚合。

数据在不同时间,可能聚合的程度不一致。比如一批数据刚导入时,可能还未与之前已存在的数据进行聚合。

但是对于用户而言,用户只能查询到聚合后的数据。即不同的聚合程度对于用户查询而言是透明的。用户需始终认为数据以最终的完成的聚合程度存在,而不应假设某些聚合还未发生。

示例一:导入数据聚合

1)建表
CREATE TABLE IF NOT EXISTS test_db.example_site_visit
(
 `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 "用户最后一次访问时间",
 `last_visit_date_not_null` DATETIME REPLACE_IF_NOT_NULL 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"      -- 指定一个副本(默认三个)
);
2)插入数据
insert into test_db.example_site_visit
values (10000, '2017-10-01', '北京', 20, 0, '2017-10-01 06:00:00', '2017-10-01 06:00:00', 20, 10, 10),
       (10000, '2017-10-01', '北京', 20, 0, '2017-10-01 07:00:00', '2017-10-01 07:00:00', 15, 2, 2),
       (10001, '2017-10-01', '北京', 30, 1, '2017-10-01 17:05:45', '2017-10-01 07:00:00', 2, 22, 22),
       (10002, '2017-10-02', '上海 ', 20, 1, '2017-10-02 12:59:12', null, 200, 5, 5),
       (10003, '2017-10-02', '广州', 32, 0, '2017-10-02 11:20:00', '2017-10-02 11:20:00', 30, 11, 11),
       (10004, '2017-10-01', '深圳', 35, 0, '2017-10-01 10:00:15', '2017-10-01 10:00:15', 100, 3, 3),
       (10004, '2017-10-03', '深圳', 35, 0, '2017-10-03 10:20:22', '2017-10-03 10:20:22', 11, 6, 6);

注意:Insert into 单条数据这种操作在 Doris 里只能演示不能在生产使用,会引发写阻塞。

3)查看表

select * from test_db.example_site_visit;

可以看到,用户 10000 只剩下了一行聚合后的数据。而其余用户的数据和原始数据保持一致。经过聚合,Doris 中最终只会存储聚合后的数据。换句话说,即明细数据会丢失,用户不能够再查询到聚合前的明细数据了。

示例二:保留明细数据

1)建表
CREATE TABLE IF NOT EXISTS test_db.example_site_visit2
(
    `user_id` LARGEINT NOT NULL COMMENT "用户 id",
    `date`            DATE NOT NULL COMMENT "数据灌入日期时间",
    `timestamp`       DATETIME 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"      -- 指定一个副本(默认三个)
);
2)插入数据
insert into test_db.example_site_visit2
values (10000, '2017-10-01', '2017-10-01 08:00:05', ' 北 京 ', 20, 0, '2017-10-01 06:00:00', 20, 10, 10),
       (10000, '2017-10-01', '2017-10-01 09:00:05', '北京', 20, 0, '2017-10-01 07:00:00', 15, 2, 2),
       (10001, '2017-10-01', '2017-10-01 18:12:10', '北京', 30, 1, '2017-10-01 17:05:45', 2, 22, 22),
       (10002, '2017-10-02', '2017-10-02 13:10:00', '上海', 20, 1, '2017-10-02 12:59:12', 200, 5, 5),
       (10003, '2017-10-02', '2017-10-02 13:15:00', '广州', 32, 0, '2017-10-02 11:20:00', 30, 11, 11),
       (10004, '2017-10-01', '2017-10-01 12:12:48', '深圳', 35, 0, '2017-10-01 10:00:15', 100, 3, 3),
       (10004, '2017-10-03', '2017-10-03 12:38:20', '深圳', 35, 0, '2017-10-03 10:20:22', 11, 6, 6);
3)查看表

select * from test_db.example_site_visit2;

存储的数据,和导入数据完全一样,没有发生任何聚合。这是因为,这批数据中,因为加入了 timestamp 列,所有行的 Key 都不完全相同。也就是说,只要保证导入的数据中,每一行的 Key 都不完全相同,那么即使在聚合模型下,Doris 也可以保存完整的明细数据。

示例三:导入数据与已有数据聚合

1)往实例一中继续插入数据
insert into test_db.example_site_visit
values (10004, '2017-10-03', '深圳', 35, 0, '2017-10-03 11:22:00', null, 44, 19, 19),
       (10005, '2017-10-03', '长沙', 29, 1, '2017-10-03 18:11:02', '2017-10-03 18:11:02', 3, 1, 1);

2)查看表

select * from test_db.example_site_visit;

可以看到,用户 10004 的已有数据和新导入的数据发生了聚合。同时新增了 10005 用户的数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值