当前位置: 首页 > news >正文

Flink-StarRocks详解:第四部分StarRocks分区管理,数据压缩(第54天)

文章目录

    • 前言
      • 2.3.3 管理分区
        • 2.3.3.1 增加分区
        • 2.3.3.2 删除分区
        • 2.3.3.3 恢复分区
        • 2.3.3.4 查看分区
      • 2.3.4 设置分桶
        • 2.3.4.1 随机分桶(自 v3.1)
        • 2.3.4.2 哈希分桶
          • 2.3.4.2.1 优点
          • 2.3.4.2.2 如何选择分桶键
          • 2.3.4.2.3 注意事项
        • 2.3.4.3 确定分桶数量
      • 2.3.5 最佳实践
    • 2.4 数据压缩
      • 2.4.1 选择数据压缩算法
      • 2.4.2 设置数据压缩算法
    • 2.5 排序键和前缀索引
      • 2.5.1 排序原理
      • 2.5.2 排序效果
      • 2.5.3 选择排序列
  • 3. 导入导出数据


前言

本文为Flink-StarRocks详解后续章节:主要详解StarRocks分区分桶管理,数据压缩,
由于篇幅过长,后续接着下面进行详解:
 StarRocks查询数据湖
 实现即席查询案例

2.3.3 管理分区

2.3.3.1 增加分区

对于 Range 分区和 List 分区,可以手动增加新的分区,用于存储新的数据,而表达式分区可以实现导入新数据时自动创建分区,无需手动新增分区。 新增分区的默认分桶数量和原分区相同。也可以根据新分区的数据规模调整分桶数量。
如下示例中,在 site_access5 表添加新的分区,用于存储新月份的数据:

ALTER TABLE test.site_access5
ADD PARTITION p4 VALUES LESS THAN ("2020-04-30")
DISTRIBUTED BY HASH(site_id);
2.3.3.2 删除分区

执行如下语句,删除 site_access5 表中分区 p1 及数据:
说明:分区中的数据不会立即删除,会在 Trash 中保留一段时间(默认为一天)。如果误删分区,可以通过 RECOVER 命令恢复分区及数据。

ALTER TABLE test.site_access5
DROP PARTITION p1;
2.3.3.3 恢复分区

执行如下语句,恢复 site_access5 表中分区 p1 及数据:

RECOVER PARTITION p1 FROM test.site_access5;
2.3.3.4 查看分区

执行如下语句,查看 site_access5 表中分区情况:

SHOW PARTITIONS FROM test.site_access5;

2.3.4 设置分桶

2.3.4.1 随机分桶(自 v3.1)

对每个分区的数据,StarRocks 将数据随机地分布在所有分桶中,适用于数据量不大,对查询性能要求不高的场景。如果不设置分桶方式,则默认由 StarRocks 使用随机分桶,并且自动设置分桶数量。
不过值得注意的是,如果查询海量数据且查询时经常使用一些列会作为条件列,随机分桶提供的查询性能可能不够理想。在该场景下建议使用哈希分桶,当查询时经常使用这些列作为条件列时,只需要扫描和计算查询命中的少量分桶,则可以显著提高查询性能。
使用限制
 仅支持明细模型表。
 不支持指定 Colocation Group。
 不支持 Spark Load。
如下建表示例中,没有使用 DISTRIBUTED BY xxx 语句,即表示默认由 StarRocks 使用随机分桶,并且由 StarRocks 自动设置分桶数量。

CREATE TABLE test.site_access9(event_day DATE,site_id INT DEFAULT '10', pv BIGINT DEFAULT '0' ,city_code VARCHAR(100),user_name VARCHAR(32) DEFAULT ''
)
DUPLICATE KEY(event_day,site_id,pv)
PROPERTIES ("replication_num" = "1"
);

当然,如果比较熟悉 StarRocks 的分桶机制,使用随机分桶建表时,也可以手动设置分桶数量。

CREATE TABLE test.site_access10(event_day DATE,site_id INT DEFAULT '10', pv BIGINT DEFAULT '0' ,city_code VARCHAR(100),user_name VARCHAR(32) DEFAULT ''
)
DUPLICATE KEY(event_day,site_id,pv)
DISTRIBUTED BY RANDOM BUCKETS 8 -- 手动设置分桶数量为 8PROPERTIES ("replication_num" = "1"
);
2.3.4.2 哈希分桶

对每个分区的数据,StarRocks 会根据分桶键和分桶数量进行哈希分桶。在哈希分桶中,使用特定的列值作为输入,通过哈希函数计算出一个哈希值,然后将数据根据该哈希值分配到相应的桶中。

2.3.4.2.1 优点

 提高查询性能。相同分桶键值的行会被分配到一个分桶中,在查询时能减少扫描数据量。
 均匀分布数据。通过选取较高基数(唯一值的数量较多)的列作为分桶键,能更均匀的分布数据到每一个分桶中。

2.3.4.2.2 如何选择分桶键

假设存在列同时满足高基数和经常作为查询条件,则建议选择其为分桶键,进行哈希分桶。 如果不存在这些同时满足两个条件的列,则需要根据查询进行判断。
 如果查询比较复杂,则建议选择高基数的列为分桶键,保证数据在各个分桶中尽量均衡,提高集群资源利用率。
 如果查询比较简单,则建议选择经常作为查询条件的列为分桶键,提高查询效率。
并且,如果数据倾斜情况严重,还可以使用多个列作为数据的分桶键,但是建议不超过 3 个列。

2.3.4.2.3 注意事项

 建表时,如果使用哈希分桶,则必须指定分桶键。
 组成分桶键的列仅支持整型、DECIMAL、DATE/DATETIME、CHAR/VARCHAR/STRING 数据类型。
 分桶键指定后不支持修改。
如下示例中,site_access 表采用 site_id 作为分桶键,其原因在于 site_id 为高基数列。此外,针对 site_access 表的查询请求,基本上都以站点作为查询过滤条件,采用 site_id 作为分桶键,还可以在查询时裁剪掉大量无关分桶。

CREATE TABLE test.site_access11(event_day DATE,site_id INT DEFAULT '10',city_code VARCHAR(100),user_name VARCHAR(32) DEFAULT '',pv BIGINT SUM DEFAULT '0'
)
AGGREGATE KEY(event_day, site_id, city_code, user_name)
PARTITION BY RANGE(event_day) (PARTITION p1 VALUES LESS THAN ("2020-01-31"),PARTITION p2 VALUES LESS THAN ("2020-02-29"),PARTITION p3 VALUES LESS THAN ("2020-03-31")
)
DISTRIBUTED BY HASH(site_id)PROPERTIES ("replication_num" = "1"
);

如下查询中,假设每个分区有 10 个分桶,则其中 9 个分桶被裁减,因而系统只需要扫描 site_access 表中 1/10 的数据:

select sum(pv)
from test.site_access11
where site_id = 54321;

但是如果 site_id 分布十分不均匀,大量的访问数据是关于少数网站的(幂律分布,二八规则),那么采用上述分桶方式会造成数据分布出现严重的倾斜,进而导致系统局部的性能瓶颈。此时,需要适当调整分桶的字段,以将数据打散,避免性能问题。例如,可以采用 site_id、city_code 组合作为分桶键,将数据划分得更加均匀。相关建表语句如下:

CREATE TABLE test.site_access12
(site_id INT DEFAULT '10',city_code SMALLINT,user_name VARCHAR(32) DEFAULT '',pv BIGINT SUM DEFAULT '0'
)
AGGREGATE KEY(site_id, city_code, user_name)
DISTRIBUTED BY HASH(site_id,city_code)
PROPERTIES ("replication_num" = "1"
);

在实际使用中,可以依据自身的业务特点选择以上两种分桶方式。采用 site_id 的分桶方式对于短查询十分有利,能够减少节点之间的数据交换,提高集群整体性能;采用 site_id、city_code 的组合分桶方式对于长查询有利,能够利用分布式集群的整体并发性能。
说明:
短查询是指扫描数据量不大、单机就能完成扫描的查询。
长查询是指扫描数据量大、多机并行扫描能显著提升性能的查询。

2.3.4.3 确定分桶数量

在 StarRocks 中,分桶是实际物理文件组织的单元。
 建表时如何设置分桶数量
 方式一:自动设置分桶数量
自 2.5.7 版本起, StarRocks 支持根据机器资源和数据量自动设置分区的分桶数量。

建表示例:
CREATE TABLE test.site_access13(site_id INT DEFAULT '10',city_code SMALLINT,user_name VARCHAR(32) DEFAULT '',pv BIGINT SUM DEFAULT '0'
)
AGGREGATE KEY(site_id, city_code, user_name)
DISTRIBUTED BY HASH(site_id,city_code)
-- 无需手动设置分桶数量
PROPERTIES ("replication_num" = "1"
);

如果需要开启该功能,则需要确保 FE 动态参数 enable_auto_tablet_distribution 为 true。 建表后,可以执行 SHOW PARTITIONS 来查看 StarRock 为分区自动设置的分桶数量。

SHOW PARTITIONS FROM test.site_access13;

 方式二:手动设置分桶数量
自 2.4 版本起,StarRocks 提供了自适应的 Tablet 并行扫描能力,即一个查询中涉及到的任意一个 Tablet 可能是由多个线程并行地分段扫描,减少了 Tablet 数量对查询能力的限制,从而可以简化对分桶数量的设置。简化后,确定分桶数量方式可以是:首先预估每个分区的数据量,然后按照每 10 GB 原始数据一个 Tablet 计算,从而确定分桶数量。
如果需要开启并行扫描 Tablet,则需要确保系统变量 enable_tablet_internal_parallel 全局生效 SET GLOBAL enable_tablet_internal_parallel = true;。

CREATE TABLE test.site_access14(site_id INT DEFAULT '10',city_code SMALLINT,user_name VARCHAR(32) DEFAULT '',pv BIGINT SUM DEFAULT '0')
AGGREGATE KEY(site_id, city_code, user_name)
DISTRIBUTED BY HASH(site_id,city_code) BUCKETS 30
-- 假设导入一个分区的原始数据量为 300 GB,则按照每 10 GB 原始数据一个 Tablet,则分桶数量可以设置为 30。
PROPERTIES ("replication_num" = "1"
);

 新增分区时如何设置分桶数量
方式一:自动设置分桶数量(推荐)
自 2.5.7 版本起, StarRocks 支持根据机器资源和数据量自动设置分区的分桶数量。
如果需要启用该功能,则需要确保 FE 动态参数 enable_auto_tablet_distribution 保持默认值 true。如果需要关闭该功能,则可以执行ADMIN SET FRONTEND CONFIG (“enable_auto_tablet_distribution” = “false”);并且新增分区的时候未指定分桶数量,则新增分区的分桶数量会继承建表时的分桶数量。 新增分区后,可以执行 SHOW PARTITIONS 来查看 StarRocks 为新增分区自动设置的分桶数量。
方式二:手动设置分桶数量
新增分区的时候,也可以手动指定分桶数量。新增分区的分桶数量的计算方式可以参考如上建表时手动设置分桶数量。

-- 手动创建分区
ALTER TABLE <table_name> 
ADD PARTITION <partition_name>[DISTRIBUTED BY HASH (k1[,k2 ...]) [BUCKETS num]];-- 手动设置动态分区的默认分桶数量
ALTER TABLE <table_name> 
SET ("dynamic_partition.buckets"="xxx");

注意:
不支持修改已创建分区的分桶数量。

2.3.5 最佳实践

对于 StarRocks 而言,分区和分桶的选择是非常关键的。在建表时选择合理的分区键和分桶键,可以有效提高集群整体性能。因此建议在选择分区键和分桶键时,根据业务情况进行调整。
 数据倾斜
如果业务场景中单独采用倾斜度大的列做分桶,很大程度会导致访问数据倾斜,那么建议采用多列组合的方式进行数据分桶。
 高并发
分区和分桶应该尽量覆盖查询语句所带的条件,这样可以有效减少扫描数据,提高并发。
 高吞吐
尽量把数据打散,让集群以更高的并发扫描数据,完成相应计算。
 元数据管理
控制Tablet数量,因为Tablet 过多会增加 FE/BE 的元数据管理和调度的资源消耗。

2.4 数据压缩

StarRocks 支持对表和索引数据进行压缩 (compression)。数据压缩不仅有助于节省存储空间,还可以提高 I/O 密集型任务的性能。
注意:压缩和解压缩数据需要额外的 CPU 资源。

2.4.1 选择数据压缩算法

StarRocks 支持四种数据压缩算法:LZ4、Zstandard(或 zstd)、zlib 和 Snappy。 这些数据压缩算法在压缩率和压缩/解压缩性能上有所不同。 通常来说,这些算法的压缩率排名如下:zlib > Zstandard > LZ4 > Snappy。其中,zlib 拥有较高的压缩比。但由于数据高度压缩,使用 zlib 算法的表,其导入和查询性能会受到一定程度的影响。而 LZ4 和 Zstandard 算法具有较为均衡的压缩比和解压缩性能。可以根据自身业务场景在这些压缩算法中进行选择,以满足对存储或性能的需求。如果对存储空间占用没有特殊需求,建议使用 LZ4 或 Zstandard 算法。
说明
不同的数据类型也会影响算法的压缩率。

2.4.2 设置数据压缩算法

只能在创建表时为其设置数据压缩算法,且后续无法修改。
以下示例基于 Zstandard 算法创建表 data_compression。

CREATE TABLE test.data_compression(`id`      INT(11)     NOT NULL     COMMENT "",`name`    CHAR(200)   NULL         COMMENT ""
)
UNIQUE KEY(`id`)
DISTRIBUTED BY HASH(`id`)
PROPERTIES (
"compression" = "ZSTD","replication_num" = "1"
);

说明
如不指定数据压缩算法,StarRocks 默认使用 LZ4。
可以通过 SHOW CREATE TABLE 命令查看指定表采用的压缩算法。

2.5 排序键和前缀索引

在建表时,可以指定一个或多个列构成排序键 (Sort Key)。表中的行会根据排序键进行排序以后再落入磁盘存储。查询数据时,可以使用排序列指定过滤条件,StarRocks 不需要扫描全表即可快速找到需要处理的数据,降低搜索的复杂度,从而加速查询。
同时,为减少内存开销,StarRocks 在排序键的基础上又引入了前缀索引 (Prefix Index)。前缀索引是一种稀疏索引。表中每 1024 行数据构成一个逻辑数据块 (Data Block)。每个逻辑数据块在前缀索引表中存储一个索引项,索引项的长度不超过 36 字节,其内容为数据块中第一行数据的排序列组成的前缀,在查找前缀索引表时可以帮助确定该行数据所在逻辑数据块的起始行号。前缀索引的大小会比数据量少 1024 倍,因此会全量缓存在内存中,在实际查找的过程中可以有效加速查询。

2.5.1 排序原理

在明细模型中,排序列就是通过 DUPLICATE KEY 关键字指定的列。
在聚合模型中,排序列就是通过 AGGREGATE KEY 关键字指定的列。
在更新模型中,排序列就是通过 UNIQUE KEY 关键字指定的列。
自 3.0 版本起,主键模型解耦了主键列和排序列,排序列通过 ORDER BY 关键字指定,主键列通过 PRIMARY KEY 关键字指定。
主键模型建表示例:

CREATE TABLE test.site_access_primary
(site_id INT DEFAULT '10',city_code SMALLINT,user_id INT,pv BIGINT DEFAULT '0'
)
PRIMARY KEY(site_id)
DISTRIBUTED BY HASH(site_id)
ORDER BY(site_id,city_code)
PROPERTIES ("replication_num" = "1"
);

在明细模型、聚合模型、更新模型中定义排序列时,需要注意以下几点:
 排序列必须从定义的第一列开始、并且是连续的。
 在定义各列时,计划作为排序列的列必须定义在其他普通列之前。
 排序列的顺序必须与表定义的列顺序一致。
例如,建表语句中声明要创建 site_id、city_code、user_id 和 pv 四列。这种情况下,正确的排序列组合和错误的排序列组合举例如下:
 正确的排序列
 site_id 和 city_code
 site_id、city_code 和 user_id
 错误的排序列
 city_code 和 site_id
 city_code 和 user_id
 site_id、city_code 和 pv
下面通过示例来说明如何创建使用各个数据模型的表。

2.5.2 排序效果

以上述建表语句为例,排序效果可以分为三种情况:
 如果查询条件只包含 site_id 和 city_code 两列,如下所示,则可以大幅减少查询过程中需要扫描的数据行:

select sum(pv) from test.site_access_duplicate where site_id = 123 and city_code = 2;

 如果查询条件只包含 site_id 一列,如下所示,可以定位到只包含 site_id 的数据行:

select sum(pv) from test.site_access_duplicate where site_id = 123;

 如果查询条件只包含 city_code 一列,如下所示,则需要扫描所有数据行,排序效果大打折扣:

select sum(pv) from test.site_access_duplicate where city_code = 2;

说明
这种情况下,排序列无法实现应有的排序效果。
在第一种情况下,为了定位到数据行的位置,需进行二分查找,以找到指定区间。如果数据行非常多,直接对 site_id 和 city_code 两列进行二分查找,需要把两列数据都加载到内存中,这样会消耗大量的内存空间。这时候可以使用前缀索引来减少缓存的数据量、并有效加速查询。
另外,在实际业务场景中,如果指定的排序列非常多,也会占用大量内存。为了避免这种情况,StarRocks 对前缀索引做了如下限制:
 前缀索引项的内容只能由数据块中第一行的排序列的前缀组成。
 前缀索引列的数量不能超过 3。
 前缀索引项的长度不能超过 36 字节。
 前缀索引中不能包含 FLOAT 或 DOUBLE 类型的列。
 前缀索引中 VARCHAR 类型的列只能出现一次,并且处在末尾位置。
 当前缀索引的末尾列是 CHAR 或 VARCHAR 类型时,前缀索引项的长度不会超过 36 字节。

2.5.3 选择排序列

这里以 site_access_duplicate 表为例,介绍如何选择排序列。
 经常作为查询条件的列,建议选为排序列。
 当排序键涉及多个列的时候,建议把区分度高、且经常查询的列放在前面。区分度高的列是指取值个数较多、且持续增加的列。例如,在上述 site_access_duplicate 表中,因为城市的数目是固定的,所以 city_code 列中取值的个数是固定的,而 site_id 列中取值的个数要比 city_code 列中取值的个数大得多、并且还会不断地增加,所以 site_id 列的区分度就比 city_code 列要高不少。
 排序键不应该包含过多的列。选择很多排序列并不有助于提升查询性能,而且会增大排序的开销,进而增加数据导入的开销。
综上所述,在为 site_access_duplicate 表选择排序列时,需要注意以下三点:
 如果需要经常按 site_id 列加 city_code 列的组合进行查询,建议选择 site_id 列作为排序键的第一列。
 如果需要经常按 city_code 列进行查询、偶尔按 site_id 列加 city_code 列的组合进行查询,建议选择 city_code 列作为排序键的第一列。
 极端情况下,如果按 site_id 列加 city_code 列组合查询所占的比例与按 city_code 列单独查询所占的比例不相上下,可以创建一个以 city_code 列为第一列的 Rollup 表。Rollup 表会为 city_code 列再建一个排序索引 (Sort Index)。

3. 导入导出数据

数据导入是指将原始数据按照业务需求进行清洗、转换、并加载到 StarRocks 中的过程,从而可以在 StarRocks 系统中进行极速统一的数据分析。
具体详见:

https://docs.starrocks.io/zh/docs/loading/Loading_intro/

另外,StarRocks也支持导出数据,可以通过 EXPORT 语句把 StarRocks 集群中指定表或分区上的数据以 CSV 的格式导出到外部存储系统。

具体详见:https://docs.starrocks.io/zh/docs/unloading/Export/

相关文章:

Flink-StarRocks详解:第四部分StarRocks分区管理,数据压缩(第54天)

文章目录 前言2.3.3 管理分区2.3.3.1 增加分区2.3.3.2 删除分区2.3.3.3 恢复分区2.3.3.4 查看分区 2.3.4 设置分桶2.3.4.1 随机分桶&#xff08;自 v3.1&#xff09;2.3.4.2 哈希分桶2.3.4.2.1 优点2.3.4.2.2 如何选择分桶键2.3.4.2.3 注意事项 2.3.4.3 确定分桶数量 2.3.5 最佳…...

为什么有时候银行贷款审核会查大数据信用?

在申请银行贷款时&#xff0c;不少人会疑惑为何银行会深入审查申请人的大数据信用信息。这背后&#xff0c;其实是银行风险控制与精准决策的体现。 首先&#xff0c;大数据信用信用能全面反映申请人的信用状况 它不仅仅局限于传统的征信报告&#xff0c;还涵盖了消费行为、社交…...

LoRa无线通讯,让光伏机器人实现无“线”管理

光伏清洁机器人&#xff0c;作为光伏电站运维的新兴关键设备&#xff0c;已跃升为继组件、支架、光伏逆变器之后的第四大核心组件&#xff0c;正逐步成为光伏电站的标准配置。鉴于光伏电站普遍坐落于偏远无人区或地形复杂之地&#xff0c;光伏清洁机器人必须具备远程操控能力、…...

买流量卡要注意什么,这些冷知识你一定要懂!

买流量卡要注意什么&#xff1f;别总盯着价格看&#xff0c;还有一些隐形的冷知识得了解一下&#xff0c;今天这篇文章就是要告诉你一些流量卡中隐藏的冷知识。 ​一、首先&#xff0c;那些月租9元、19元的流量卡&#xff0c;大概率都是短期卡&#xff0c;虽然他们的资费便宜&a…...

【嵌入式】STM3212864点阵屏使用SimpleGUI单色屏接口库——(2)精简字库

一 开源库简介与移植 最近一个项目需要用12864屏幕呈现一组较为复杂的菜单界面&#xff0c;本着不重复造轮子的原则找到了SimpleGUI开源库。 开源地址&#xff1a;SimpleGUI: 一个面向单色显示屏的开源GUI接口库。 SimpleGUI是一款针对单色显示屏设计的接口库。相比于传统的GUI…...

《计算机网络》(第8版)第1章 概述 复习笔记

第 1 章 概述 一、计算机网络在信息时代中的作用 计算机网络的两个重要功能&#xff1a; 1 &#xff0e;连通性 指互联网上的用户之间是相互连通的。 2 &#xff0e;共享&#xff08;资源共享&#xff09; 资源共享可以是信息共享、软件共享&#xff0c;也可以是硬件共享。此…...

银行数据质量保障体系建设实践

引言 在数字化转型浪潮中&#xff0c;数据中台成为企业实现数据驱动决策的关键支撑。它不仅整合了企业内外部的数据资源&#xff0c;还通过数据共享与复用&#xff0c;提升了运营效率和业务创新能力。然而&#xff0c;随着数据量的激增和数据来源的多样化&#xff0c;如何确保…...

笔记小结:《利用Python进行数据分析》二进制数据格式存储与web交互

提示&#xff1a;此节内容仅作了解即可 目录 二进制数据格式 使用HDF5 读取Microsoft Excel文件 二进制数据格式 实现数据的高效二进制格式存储最简单的办法之一是使用Python内置的pickle序列化。 Python 的 pickle 模块是一个用于序列化和反序列化 Python 对象结构的模块…...

电脑桌面图标变白了?3个方法20秒钟轻松解

电脑桌面图标变白了&#xff1f;3个方法20秒钟轻松解 ⚠️电脑桌面图标变白了&#xff0c;3种方法轻松解决 &#x1f6b8;方法一和方法二属于治标不治本的解决方法&#xff0c;但操作较为简单&#xff0c;在不同情况下有不成功的可能&#xff0c;方法三相对复杂一些&#xff0c…...

数据治理,管什么?

元数据&#xff08;Metadata&#xff09;&#xff1a;通俗地说就是描述数据的数据&#xff0c;比如数据的名称、属性、分类、字段信息、大小、标签等等。要做好数据的管理&#xff0c;元数据起到了举足轻重的作用。 参考数据&#xff08;Reference Data&#xff09;&#xff1…...

【前端】JavaScript入门及实战121-125

文章目录 121 滚轮事件122 键盘事件123 键盘移动div124 BOM125 History 121 滚轮事件 <!DOCTYPE html> <html> <head> <title></title> <meta charset "utf-8"> <style type"text/css">#box1 {width: 100px;h…...

pytest测试框架之http协议接口测试

1 接口测试 日常测试中接口测试是一项重要的工作&#xff0c;尤其是http协议的接口测试更加普遍,比如一些常用的测试框架或者工具&#xff08;robotframework框架&#xff0c;testng框架&#xff0c;postman等&#xff09;都支持http接口的测试&#xff0c;而这节内容主要介绍…...

FFmpeg源码:av_gcd函数分析

一、引言 公约数&#xff0c;是一个能同时整除几个整数的数。如果一个整数同时是几个整数的约数&#xff0c;称这个整数为它们的“公约数”&#xff1b;公约数中最大的称为最大公约数。对任意的若干个正整数&#xff0c;1总是它们的公约数。 公约数与公倍数相反&#xff0c;就…...

springboot物流寄查系统-计算机毕业设计源码95192

目 录 1 绪论 1.1 研究背景 1.2选题背景 1.3论文结构与章节安排 2 springboot物流寄查系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2…...

【秋招笔试】24-07-27-OPPO-秋招笔试题(算法岗)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 💡 第一题贪心模拟…...

AUTOSAR实战教程 - 模式管理BswM与其他各模块的交互

近日驻厂某OEM,幸得大块的个人时间, 把BswM这一块的内容从ETAS/ISOLAR工具配置到代码实现做了一个全方位的CT. 2024,希望孜孜内卷的汽车人升职加薪! 博主近期写的一首小诗,也一并送给大家,懂的都懂: 在看不到阳光的冬天/ 我染了风寒/ 白天点灯/ 晚上吃药/ 躺在被窝里才敢…...

经典非比较排序—计数排序的Java实现方式

目录 1.具体思路&#xff1a; 2.代码实现&#xff1a; 3.代码分析 4.示例测试&#xff1a; 测试源码&#xff1a; 测试结果&#xff1a; 计数排序&#xff0c;又被称为鸽巢原理&#xff0c;属于桶排序的一种&#xff0c;其本质是通过哈希映射思想&#xff0c;设定计数数组输入以…...

【C++从小白到大牛】栈和队列(优先级队列)

目录 引言&#xff1a; 使用方法篇&#xff1a; stack&#xff1a; queue priority_queue 使用方法&#xff1a; 模拟实现篇&#xff1a; stack&#xff1a; 原码&#xff1a; queue 原码&#xff1a; priority_queue 插入和删除数据的思想&#xff1a; 仿函数实…...

Golang之OpenGL(一)

使用OpenGL实现窗口中绘制三角形&#xff08;纯色|彩色&#xff09;、正方形&#xff08;变色&#xff09; 一、简单实现窗口绘制三角形二、绘制的多颜色三角形&#xff08;基于 ‘ 简单实现窗口绘制三角形 ’ &#xff09;1、在顶点着色器和片段着色器中添加了颜色的输入和输出…...

122. Go反射中与结构体相关的常用方法与应用

文章目录 encoding/jsonreflect 简介reflect.Value 常用方法reflect.Type 常用方法 应用一&#xff1a;使用 reflect 实现 encoding/json序列化反序列化 应用二&#xff1a;使用Tag实现字段级别的访问控制tag 行为自定义案例&#xff1a;结构体字段访问控制 总结 在使用 Go 语言…...

Java入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享

场景 作为一名Java开发者&#xff0c;势必经历过从入门到自学、从基础到进阶、从学习到强化的过程。 当经历过几年企业级开发的磨炼&#xff0c;再回头看之前的开发过程、成长阶段发现确实是走了好多的弯路。 作为一名终身学习的信奉者&#xff0c;秉承Java体系需持续学习、…...

Spring-bean销毁

bean销毁(找到销毁的bean) 在bean的声明周期中&#xff0c;存在一个记录bean销毁方法的阶段&#xff0c;以备于spring关闭的时候可以执行bean的销毁方法&#xff08;单例bean&#xff09; v1.0 registerDisposableBeanIfNecessary protected void registerDisposableBeanIfNec…...

【4】BlazorUI库

【4】BlazorUI库 一、Blazorise二、Ant Design Blazor三、Radzen Blazo四、Radzen Blazo 一、Blazorise Blazorise Blazorise 是一个广泛使用的 UI 框架&#xff0c;提供了丰富的组件库和多个主题支持&#xff0c;如 Bootstrap、Bulma、Material 和 AntDesign。 二、Ant Desig…...

树与二叉树【下】

目录 三. 哈夫曼树3.1 带权路径长度3.2 哈夫曼树的定义3.3 哈夫曼树的构造3.4 哈夫曼编码&#xff08;经常考察&#xff09; 四. 并查集4.1 如何表示“集合”关系&#xff1f;4.2 “并查集”的代码实现4.3 “并查集”的优化4.4 “并查集”的进一步优化 \quad 三. 哈夫曼树 \qua…...

ElementPlus 中el-select自定义指令实现触底加载请求options数据

1) 背景: 老项目翻新时&#xff0c;发现一个下拉框数据非常多&#xff0c;客户呢&#xff0c;希望全部数据一起展示&#xff0c;意思就是全部数据一起返回给前端用于展示。但这会造成明显的卡顿。~~明显的不合理! QAQ!~~ 于是压力给到前端&#xff0c;查询资料&#xff0c;各种…...

基于Selenium实现操作网页及操作windows桌面应用

Selenium操作Web页面 Why? 通常情况下&#xff0c;网络安全相关领域&#xff0c;更多是偏重于协议和通信。但是&#xff0c;如果协议通信过程被加密或者无法了解其协议构成&#xff0c;是无法直接通过协议进行处理。此时&#xff0c;可以考虑模拟UI操作&#xff0c;进而实现相…...

科普文:linux系列之操作系统内存管理简介

概叙 操作系统内存管理是计算机系统中的核心技术之一&#xff0c;页式管理、段式管理和段页式管理各有优缺点。页式管理通过固定大小的页框减少了外部碎片&#xff0c;但可能导致内部碎片&#xff1b;段式管理符合程序逻辑&#xff0c;提供了灵活的内存保护&#xff0c;但可能…...

【已解决】关于MyBatis的collection集合中只能取到一条数据的问题

一、问题 在涉及多表查询的时候&#xff0c;使用collection元素来映射集合属性时&#xff0c;出现了只能查询到一条数据的情况&#xff0c;但用sql语句在数据库中查询会有多条记录。 二、原因 如果两表联查&#xff0c;主表和明细表的主键都是id的话&#xff0c;明细表的多条…...

前端的学习-CSS(弹性布局-flex)

一&#xff1a;什么是弹性布局-Flex flex 是 Flexible Box 的缩写&#xff0c;意为"弹性布局"&#xff0c;用来为盒状模型提供最大的灵活性。 语法&#xff1a; .box{display: flex; } .box{display: inline-flex; } 注意&#xff0c;设为 Flex 布局以后&#xff0…...

vue3集成LuckySheet实现导入本地Excel进行在线编辑,以及导出功能

第一步&#xff1a;克隆或者下载下面的代码 git clone https://github.com/dream-num/Luckysheet.git第二步&#xff1a;安装依赖 npm install npm install gulp -g 第三步&#xff1a;运行 npm run dev效果如下图所示 第四步&#xff1a;打包 打包执行成功后&#xff0c;…...