第2.2章:StarRocks表设计--数据模型

【大数据】StarRocks的四种数据模型 这边博客,我们主要来学习下StarRocks的四种数据模型:明细模型 (Duplicate Key Model)、聚合模型 (Aggregate Key Model)、更新模型 (Unique Key Model) 和主键模型 (Primary Key Model)。这四种数据模型能够支持多种数据分析场景,例如日志分析、数据汇总分析、实时分析等。 阅读详情

为了全面的满足企业业务上的分析需求,StarRocks当前设计了四种数据模型:明细模型、聚合模型、更新模型、主键模型。

1明细模型

明细模型是StarRocks中最常用的数据模型,顾名思义,它会保留所有的明细数据,也就是说,在明细模型下,即便导入两条完全相同的数据,StarRocks也会将数据原封不动的保存进表,不会进行聚合的操作,也没有update的语义。

基于明细模型的特点,我们不难发现,明细模型通常用于追加式的数据写入,比较适合:

1、需要保留原始数据的业务;

2、查询维度不固定的业务;

3、数据产生后就不会发生太多变化的业务。

还是举一个简单的例子,在starrocks库中创建明细模型表table02:

CREATE TABLE IF NOT EXISTS starrocks.table02 (

    event_time DATETIME NOT NULL COMMENT "datetime of event",

    event_type INT NOT NULL COMMENT "type of event",

    user_id INT COMMENT "id of user",

    channel INT COMMENT ""

)

DUPLICATE KEY(event_time, event_type,user_id)

DISTRIBUTED BY HASH(user_id) BUCKETS 10;

这里我们使用DUPLICATE KEY(event_time, event_type, user_id)显式的说明采用明细模型,并且指定排序键为event_time、event_type和user_id。排序键是指该表中数据存储时多重排序的次序,具体概念我们后面再讨论,这里先注意:

1、若在数据列中我们未定义聚合函数(例如2.1章table01的total列),则默认采用明细模型;

2、明细模型可以使用DUPLICATE KEY(列1,列2……)显式的说明使用明细模型,也可以整个省略;

3、若显式指定使用明细模型,则DUPLICATE KEY(列1,列2……)中,排序键“列1、列2……”需要是建表语句中的前几列,且顺序需要和建表语句中的保持一致(例如table02中的event_time, event_type和table01中的user_id, device_code,device_price,event_time),否则建表会报错;

4、在省略DUPLICATE KEY(列1,列2……)时,StarRocks通常也会默认为表选择前三列作为排序键。

所以,table02的建表语句也可以简写为:

CREATE TABLE IF NOT EXISTS starrocks.table02 (

    event_time DATETIME NOT NULL COMMENT "datetime of event",

    event_type INT NOT NULL COMMENT "type of event",

    user_id INT COMMENT "id of user",

    channel INT COMMENT ""

)

DISTRIBUTED BY HASH(user_id);

我们对table02导入几条数据:

mysql> insert into table02 values('2021-03-11',27,1001,01);

mysql> insert into table02 values('2021-03-11',27,1001,01);

mysql> insert into table02 values('2021-03-12',31,1002,02);

mysql> select * from table02;

+------------------------------+-------------------+-------------+--------------+

| event_time                   | event_type     | user_id     | channel   |

+------------------------------+-------------------+-------------+--------------+

| 2021-03-12 00:00:00   |         31           |    1002     |       2         |

| 2021-03-11 00:00:00   |         27           |    1001     |       1         |

| 2021-03-11 00:00:00   |         27           |    1001     |       1         |

+------------------------------+-------------------+-------------+--------------+

可以发现,虽然导入的前两条数据完全相同,明细模型仍将其视为两条单独数据完整的保存进表。
 

2聚合模型

在上一篇概述章节我们已经举了一个聚合模型的例子,准确来说,聚合模型会在数据导入时将维度列相同的数据根据指标列设定的聚合函数进行聚合,最终表格中只会保留聚合后的数据。聚合模型可以减少查询时需要处理的数据量,进而提升查询的效率,其适合的场景如下:

1、不需要原始的明细数据,只关注汇总的结果;

2、业务涉及的查询为汇总类查询,比如sum、min、max、count等类型的查询;

3、查询维度固定。

再举一个聚合模型的例子,在starrocks库中建表table03:

CREATE TABLE IF NOT EXISTS starrocks.table03 (

    site_id LARGEINT NOT NULL COMMENT "id of site",

    date DATE NOT NULL COMMENT "time of event",

    city_code VARCHAR(20) COMMENT "city_code of user",

    state INT COMMENT "web state",

    pv BIGINT SUM DEFAULT "0" COMMENT "total page views"

)

DISTRIBUTED BY HASH(site_id) BUCKETS 8;

前面提到过,在建表时只要给指标列的定义指明聚合函数,就会启用聚合模型,所以这里我们省略了AGGREGATE KEY(site_id, date, city_code, state)。因为是聚合模型,这里的AGGREGATE KEY()要么整个省略,要么在小括号中给排序键按建表顺序指定所有的维度列,也即table03中没有聚合函数的前四列。在创建完成后,我们可以使用show create table语句查看表的创建语句,会发现是一样的。

在聚合模型中,StarRocks还支持聚合函数REPLACE_IF_NOT_NULL。这个聚合类型的含义是当且仅当新导入数据是非NULL值时会发生替换行为,如果新导入的数据是NULL,那么StarRocks仍然会保留原值。我们可以借助这种聚合类型实现部分列导入的业务。
 

3更新模型

明细模型会将所有写入的数据保留,聚合模型是对写入的数据进行聚合处理,而更新模型的特点是只保留相同主键下最新导入的数据。在更新模型中,排序键构成表的唯一性约束,成为我们常说的“主键”。

明细模型和聚合模型都不适合处理数据频繁更新的场景。比如在电商场景中,订单的状态经常会发生变化,每天的订单更新量可达到上亿,若在明细模型下通过delete+insert的方式实现更新,效率是比较低的,更新模型就是针对这种场景的实时数据分析设计的。

这里我们创建一个订单类的表table04:

CREATE TABLE IF NOT EXISTS starrocks.table04 (

    create_time DATE NOT NULL COMMENT "create time of an order",

    order_id BIGINT NOT NULL COMMENT "id of an order",

    order_state INT COMMENT "state of an order",

    total_price BIGINT COMMENT "price of an order"

)

UNIQUE KEY(create_time, order_id)

DISTRIBUTED BY HASH(order_id) BUCKETS 8;

不同于明细模型和聚合模型,这里的UNIQUE KEY(create_time, order_id)不能省略,且其中的排序键“create_time+order_id”构成了唯一主键,主键相同的数据,StarRocks只会保留最后导入的那一条。

逻辑上,更新模型也可以理解为一种特殊的聚合模型。以table04为例,create_time和order_id为维度列,order_state和total_price为指标列,指标列聚合类型为REPLACE。

为方便理解,我们为table04导入三条数据:

mysql> insert into table04 values('2021-03-11',20210311001,01,100);

mysql> insert into table04 values('2021-03-11',20210311001,02,200);

mysql> insert into table04 values('2021-03-12',20210312001,01,100);

前两条数据的主键相同,指标列不同,根据更新模型特点,我们推测出数据库中最终的数据应该是只保留第二条和第三条,导入完成后,我们查看数据:

mysql> select * from table04;

+---------------------+-------------------+--------------------+---------------------+

| create_time       | order_id          | order_state      |  total_price       |

+---------------------+-------------------+--------------------+---------------------+

| 2021-03-11        | 20210311001 |           2            |         200           |

| 2021-03-12        | 20210312001 |           1           |         100            |

+---------------------+-------------------+--------------------+---------------------+

数据情况符合预期。

这里还需要注意,更新模型的“更新”,并不是说其支持update,而是通过追加式的数据写入,用新的数据去覆盖主键相同的历史数据,从而实现更新。同时,更新模型在导入数据时需要将所有字段补全才能够完成更新操作。

更新模型建表时,我们通常将需要经常被过滤且不会被修改的字段放在“主键”上来提升查询性能。同时,我们也需要避免放置过多的“主键”字段,因为数据导入时的合并过程需要对所有“主键”字段进行比较,当“主键”字段较多时,整体的查询性能就会下降。假如某个字段只是偶尔会作为查询中的过滤条件存在,不需要放在“主键”中。

对于更新模型的数据读取,因为需要在查询时完成多版本合并,当版本过多时会导致查询性能降低。所以在向更新模型导入数据时,应该适当降低导入频率,从而提升查询性能。建议在设计导入频率时以满足业务对实时性的要求为准。如果业务对实时性的要求是分钟级别,那么每分钟导入一次更新数据即可,不需要秒级导入。

4主键模型

明细模型、聚合模型和更新模型都不支持update语法,为实现update功能,StarRocks又自研了主键模型:primary key。

主键模型与更新模型的特点比较接近,主键模型的表要求有唯一的主键,支持对表中的行按主键进行更新和删除操作。但对比更新模型,主键模型通过牺牲微小的写入性能和内存占用,极大提升了查询性能。同时,主键模型可以更好地支持实时/频繁更新的功能,特别适合MySQL或其他数据库同步到StarRocks的场景。以table05为例:

create table starrocks.table05 (

    dt date NOT NULL,

    order_id bigint NOT NULL,

    user_id int NOT NULL,

    merchant_id int NOT NULL,

    good_id int NOT NULL,

    good_name string NOT NULL,

    price int NOT NULL,

    cnt int NOT NULL,

    revenue int NOT NULL,

    state tinyint NOT NULL

) PRIMARY KEY (dt, order_id)

PARTITION BY RANGE(`dt`) (

    PARTITION p20210929 VALUES [('2021-09-29'), ('2021-09-30')),

    PARTITION p20210930 VALUES [('2021-09-30'), ('2021-10-01'))

) DISTRIBUTED BY HASH(order_id) BUCKETS 4

PROPERTIES("replication_num" = "3");

主键模型当前也还不直接支持update语法(后续会逐步支持),目前使用主键模型的限制也相对较多:

1、主键列仅支持类型: boolean、tinyint、smallint、int、bigint、largeint、string/varchar、date和datetime,不允许NULL;

2、分区列(partition)、分桶列(bucket)必须在主键列中;

3、和更新模型不同,主键模型允许为非主键列创建bitmap等索引,但需要建表时指定;

4、由于其列值可能会更新,主键模型目前还不支持rollup index和物化视图;

5、Alter table目前仅支持添加/删除列,还不支持更改列类型和添加删除索引等操作;

6、在设计表时应尽量减少主键的列数和大小以节约内存,建议使用int/bigint等占用空间少的类型。暂时不建议使用varchar。建议提前根据表的行数和主键列类型来预估内存使用量,避免出现OOM。内存估算举例:

a. 假设表的主键为: dt date (4byte), id bigint(8byte) = 12byte

b. 假设热数据有1000W行, 存储3副本

c. 内存占用计算:(12 + 9(每行固定开销) ) * 1000W * 3 * 1.5(hash表平均额外开销) = 945M

7、目前主键模型仍只支持整行更新,还不支持部分列更新。

在1.19版本中,主键模型是作为“实验功能”发布的,由于存储引擎会为主键建立索引,而在导入数据时会把主键索引加载在内存中,所以主键模型对内存的要求比较高,后续版本也会不断的优化内存占用。目前推荐使用的场景有:

1、数据有冷热特征,比如最近几天的热数据才经常被修改,老的冷数据很少被修改(老的业务数据导入完成后不再更新,新数据导入时老数据的主键索引就不会加载,也就不会占用内存,内存中仅会加载最近几天的索引);

2、大宽表(数百到数千列)。主键只占整个数据的很小一部分,其内存开销比较低。

主键模型的“插入/更新/删除”目前只支持使用“导入”的方式完成,通过SQL语句(insert/update/delete)来操作数据的功能会在未来版本中支持。目前支持的导入方式有stream load、broker load、routine load、Json数据导入,Spark load还未支持。

关于主键模型的数据导入,官网文档中介绍的非常详细,这里不再赘述,文档地址:

数据模型介绍 @ Data_model @ StarRocks Docs
https://docs.starrocks.com/zh-cn/main/table_design/Data_model#%E6%8F%92%E5%85%A5%E6%9B%B4%E6%96%B0%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C

特别注意:不要在1.19之前的版本中使用主键模型表,虽然可以创建成功,但功能无法正常使用。
 

整合StarRocks主键表全部知识点 总结starrocks主键表全部知识点 阅读详情

相关推荐

第2.2章 StarRocks表设计——排序键和数据模型

2.2 StarRocks表设计——排序键和数据模型

爱吃辣条的博客 4221

StarRocks 的数据模型

目前,StarRocks 支持的数据模型有:明细模型(Duplicate Key)、聚合模型(Aggregate Key)、更新模型(Unique Key)和主键模型(Primary Key)。其中,更新模型和主键模型是聚合模型的特殊情形。下面将详细介绍这些模型的特点和使用场景。

jinahong101的博客 1810

第2.4章 StarRocks表设计——分区分桶与副本数

2.4 StarRocks表设计——分区分桶与副本数

爱吃辣条的博客 6549

第2.1章 StarRocks表设计——概述

第2.1章 StarRocks表设计——概述

爱吃辣条的博客 2264

StarRocks官方文档

StarRocks是新一代极速全场景MPP数据库。StarRocks充分吸收关系型OLAP数据库和分布式存储系统在大数据时代的优秀研究成果,在业界实践的基础上,进一步改进优化、升级架构,并增添了众多全新功能,形成了全新的企业级产品。StarRocks致力于构建极速统一分析体验,满足企业用户的多种数据分析场景,支持多种数据模型(明细模型、聚合模型。

cgk_ALEM的博客 1642

03_Americanas精益管理项目_StarRocks

StarRocks 是新一代极速全场景 MPP (Massively Parallel Processing) 数据库。MPP,即大规模并行处理。MPP是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的结果汇总到一起得到最终的结果(跟Hadoop相似)。具有可伸缩性强、高可用、高性能等优势。特点:(1)MPP、向量化引擎、CBO优化器、物化视图,使查询速度遥遥领先(2)支持实时数据分析(3)StarRocks兼容MySQL协议,支持标准SQL语法。

AGI爱好者_数仓&可视化&数据分析工程师_Vae’伯乐‘ 1414

第2.1章:StarRocks表设计--概述

建表是使用StarRocks非常重要的一环,规范的表设计在某些场景下甚至能使查询性能有数倍的提升。StarRocks的表设计涉及到的知识点主要包括数据模型选择、分区分桶、排序键和前缀索引、列级别索引以及字段类型等等。 StarRocks的建表语句与MySQL比较相似,但也有自己的特点。我们先在StarRocks中创建一个演示用的数据库starrocks(后续所有的建表咱们都在里面进行),然后用比较规范的建表语句创建表table01。这里的建表语句我们只是先把涉及的点覆盖到,后面会逐项展开说明: mys

流木的博客 5507

StarRocks从入门到精通系列四:表设计

StarRocks从入门到精通系列四:表设计

zhengzaifeidelushang的博客 960

Flink-StarRocks详解:第二部分(第52天)

本文为Flink-StarRocks详解后续章节:主要详解StarRocks表设计,聚合,更新,主键三大数据模型。由于篇幅过长,后续接着下面进行详解: StarRocks分区分桶 StarRocks查询数据湖 实现即席查询案例。

syhiiu的博客 6620

洪水风险图制作全流程:HEC-RAS 与 ArcGIS 的耦合应用

本文系统介绍HEC-RAS水动力模拟软件在水利工程中的应用技术。内容涵盖:1)软件理论与安装;2)一维地形数据导入与河网构建;3)恒定流/非恒定流计算及模型调试要点;4)构筑物建模技术(桥梁、堰闸等);5)二维水动力模拟与溃坝分析;6)洪水风险图绘制。重点讲解水面线调试、糙率选取、报错分析等实操难点,通过案例教学实现从基础到工程应用的全流程技术掌握。该培训适用于防洪评价、河道治理等水利工程数值模拟需求。

2403_89974123的博客 1050

UE5入门第二周总结:基于蓝图的国际象棋的实现

在C++的学习中,这是一个入门级别的项目。我们的目标是灵活运用蓝图的特性和强大的可视化功能,做出这一入门级项目的同时,思考如何优化并改进算法,并尽可能的用面向对象的方法实现,用蓝图中的继承和多态简化编码过程。

YoungeYang的博客 1259

StarRocks 的表设计规范与监控体系

StarRocks 是一款高性能分析型数据仓库,使用向量化、MPP 架构、CBO、智能物化视图、可实时更新的列式存储引擎等技术实现多维、实时、高并发的数据分析。StarRocks 既支持从各类实时和离线的数据源高效导入数据,也支持直接分析数据湖上各种格式的数据。StarRocks 兼容 MySQL 协议,可使用 MySQL 客户端和常用 BI 工具对接。同时 StarRocks 具备水平扩展,高可用、高可靠、易运维等特性。广泛应用于实时数仓、OLAP 报表、数据湖分析等场景,本文实例版本2.2。

weixin_54735428的博客 1454

Python实战:5分钟搞定N-CMAPSS航空发动机数据集解析(附完整代码)

本文提供了一份针对N-CMAPSS航空发动机数据集的快速解析实战指南。通过Python的h5py和Pandas库,详细演示了如何高效读取HDF5格式文件、理解数据结构、提取关键特征(如传感器数据与剩余使用寿命RUL),并整合为可用于预测性维护分析的DataFrame,帮助研究者和工程师快速上手这一重要的工业时序数据集。

weixin_29083373的博客 278

StarRocks表设计

我们先来看一段代码 create table if not exists test ( event_time DATETIME NOT NULL COMMENT "datetime of event", event_type INT NOT NULL COMMENT "type of event", user_id INT COMMENT "id of user", device_code INT COMMENT "device of ", channel INT C

Acer12138的博客 5135

告别调参烦恼:用Simulink手把手实现自适应模糊PID温度控制(附模型下载)

本文详细介绍了如何使用Simulink实现自适应模糊PID温度控制,解决传统PID调参难题。通过模糊推理引擎动态调整PID参数,系统能自动适应不同工况,显著提升控制精度和响应速度。文章包含完整的建模步骤、参数优化技巧和工业应用扩展,并附赠可下载模型,帮助工程师快速掌握这一智能控制技术。

weixin_30872499的博客 153

c#【保姆级教程】基于System.Text.Json 支持多态类型序列化! 手把手教你实现一个通用的 PolymorphicJsonConverter!

我们需要自己实现一个继承自的转换器,在序列化时记录具体类型,在反序列化时根据类型标识还原成正确的子类对象。public abstract class WorkStepBase { /* 抽象方法等 */ }public class Person : WorkStepBase { /* 实现 */ }public class Product : WorkStepBase { /* 实现 */ }特性说明✅ 自动发现子类无需手动维护类型列表,自动扫描程序集✅ 类名映射。

一个编程的同学 425

第2.3章:StarRocks表设计--排序键和前缀索引

在介绍StarRocks的四种数据模型时,我们多次提到了排序键,也列出了一些排序键的注意事项,现在咱们来一起研究下到底什么是排序键。 1排序键 StarRocks为了加速查询,底层的数据是按照指定的列排序存储的,这部分用于排序的列(可以是一列或多列),就称为排序键(Sort Key)。以排序列作为条件进行数据查找,会非常的高效。 直观来看,各个模型的排序键就是建表语句中DUPLICATE KEY、AGGREGATE KEY、UNIQUE KEY或PRIMARY KEY后面指定的列。但是四种模型的排序键

流木的博客 6180

silero-vad 训练自己的数据

silero-vad 训练自己的数据

jacke121的专栏 815

告别查询延迟!StarRocks表设计实战指南:从入门到性能优化

你是否还在为大规模数据分析时的查询延迟而烦恼?是否因表结构设计不当导致资源浪费和性能瓶颈?本文将系统讲解StarRocks表设计的核心原则与实战技巧,帮助你从新手成长为表设计专家,充分发挥这个分布式数据分析引擎的性能优势。读完本文后,你将掌握数据模型选择、分区策略制定、索引优化等关键技能,轻松应对亿级数据查询场景。 StarRocks作为一款开源分布式数据分析引擎,采用了精简的架构设计,主要由F...

gitblog_00828的博客 450

fast-lio运行步骤(使用velodyne数据)

使用fast-lio运行velodyne数据

ericdowney 4769

《YOLOv8:从入门到实战》专栏介绍 & 专栏目录

本专栏涵盖了丰富的YOLOv8算法从入门到实战系列教程,专为学习YOLOv8的同学而设计,堪称全网最详细的教程!🌈🌈🌈

小哥谈 6488

StarRocks 的学习笔记

StarRocks 是一款极速全场景MPP 分析型数据库,可以“一栈式”的响应企业各类低延迟场景的查询需求。 StarRocks的愿景是能够让用户的数据分析变得更加简单和敏捷。用户无需经过复杂的预处理,就可以用StarRocks 来支持多种数据分析场景的极速分析。 StarRocks的架构简洁,采用了全面向量化引擎,并配备全新设计的 CBO 优化器,查询速度(尤其是多表关联查询)远超同类产品。

weixin_45866849的博客 7738

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

StarRocks(二)表设计

1、表设计 1.1、列式存储 StarRocks的表和关系型数据相同, 由行和列构成. 每行数据对应用户一条记录, 每列数据有相同数据类型. 所有数据行的列数相同, 可以动态增删列. StarRocks中, 一张表的列可以分为维度列(也成为key列)和指标列(value列), 维度列用于分组和排序, 指标列可通过聚合函数SUM, COUNT, MIN, MAX, REPLACE, HLL_UNION, BITMAP_UNION等累加起来. 因此, StarRocks的表也可以认为是...

Yuan_CSDF的博客 3743

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

新一代MPP数据库:StarRocks

OLAP数据库(Online Analytical Processing Database,在线分析处理数据库)

zhiyikeji的博客 5169
上一篇: 第2.1章:StarRocks表设计--概述
下一篇: 第2.3章:StarRocks表设计--排序键和前缀索引
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值