Flink-StarRocks详解:第三部分StarRocks分区分桶(第53天)
文章目录
- 前言
- 2.3 数据分布
- 2.3.1 数据分布概览
- 2.3.1.1 常见的数据分布方式
- 2.3.1.2 StarRocks的数据分布方式
- 2.3.1.3 分区
- 2.3.1.4 分桶
- 2.3.2 创建分区
- 2.3.2.1 表达式分区
- 2.3.2.1.1 时间函数表达式分区(自v3.1)
- 2.3.2.1.2 列表达式分区(自v3.1)
- 2.3.2.2 Range 分区
- 2.3.2.3 List分区
- 2.3.2.3.1 功能介绍
- 2.3.2.3.2 使用方式
- 2.3.2.3.2.1 语法
- 2.3.2.3.2.2 参数说明
- 2.3.2.3.2.3 示例
- 2.3.2.3.3 使用限制
- 2.3.2.4 手动创建分区
- 2.3.2.5 批量创建分区
- 2.3.2.6 动态分区
前言
本文为Flink-StarRocks详解后续章节:主要详解StarRocks分区分桶
由于篇幅过长,后续接着下面进行详解:
StarRocks查询数据湖
实现即席查询案例
2.3 数据分布
建表时,可以通过设置合理的分区和分桶,实现数据均匀分布和查询性能提升。数据均匀分布是指数据按照一定规则划分为子集,并且均衡地分布在不同节点上。查询时能够有效裁剪数据扫描量,最大限度地利用集群的并发性能,从而提升查询性能。
说明
自 2.5.7 版本起,在建表和新增分区时可以不设置分桶数量 (BUCKETS)。StarRocks 默认自动设置分桶数量,如果自动设置分桶数量后性能未能达到预期,并且比较熟悉分桶机制,则也可以手动设置分桶数量。
自 3.1 版本起,在建表和新增分区时可以不设置分桶键(即 DISTRIBUTED BY 子句)。StarRocks 默认使用随机分桶,将数据随机地分布在分区的所有分桶中。
2.3.1 数据分布概览
2.3.1.1 常见的数据分布方式
现代分布式数据库中,常见的数据分布方式有如下几种:Round-Robin、Range、List 和 Hash。如下图所示:
Round-Robin:以轮询的方式把数据逐个放置在相邻节点上。
Range:按区间进行数据分布。如上图所示,区间 [1-3]、[4-6] 分别对应不同的范围 (Range)。
List:直接基于离散的各个取值做数据分布,性别、省份等数据就满足这种离散的特性。每个离散值会映射到一个节点上,多个不同的取值可能也会映射到相同节点上。
Hash:通过哈希函数把数据映射到不同节点上。
为了更灵活地划分数据,除了单独采用上述数据分布方式之一以外,还可以根据具体的业务场景需求组合使用这些数据分布方式。常见的组合方式有 Range+Hash、List+Hash。
2.3.1.2 StarRocks的数据分布方式
StarRocks 支持单独和组合使用数据分布方式。
说明:除了常见的分布方式外, StarRocks 还支持了 Random 分布,可以简化分桶设置。
并且 StarRocks 通过设置分区 + 分桶的方式来实现数据分布。
第一层为分区:在一张表中,可以进行分区,支持的分区方式有表达式分区、Range 分区和 List 分区,或者不分区(即全表只有一个分区)。
第二层为分桶:在一个分区中,必须进行分桶。支持的分桶方式有哈希分桶和随机分桶。
2.3.1.3 分区
分区用于将数据划分成不同的区间。分区的主要作用是将一张表按照分区键拆分成不同的管理单元,针对每一个管理单元选择相应的存储策略,比如分桶数、冷热策略、存储介质、副本数等。StarRocks 支持在一个集群内使用多种存储介质,可以将新数据所在分区放在 SSD 盘上,利用 SSD 优秀的随机读写性能来提高查询性能,将旧数据存放在 SATA 盘上,以节省数据存储的成本。
选择分区列和分区粒度
选择合理的分区列可以有效的裁剪查询数据时扫描的数据量。业务系统中⼀般会选择根据时间进行分区,以优化大量删除过期数据带来的性能问题,同时也方便冷热数据分级存储,此时可以使用时间列作为分区列进行表达式分区或者 Range 分区。此外,如果经常按照枚举值查询数据和管理数据,则可以选择枚举值的列作为分区列进行表达式分区或者 List 分区。
选择分区单位时需要综合考虑数据量、查询特点、数据管理粒度等因素。
示例 1:表单月数据量很小,可以按月分区,相比于按天分区,可以减少元数据数量,从而减少元数据管理和调度的资源消耗。
示例 2:表单月数据量很大,而大部分查询条件精确到天,如果按天分区,可以做有效的分区裁剪,减少查询扫描的数据量。
示例 3:数据要求按天过期,可以按天分区。
2.3.1.4 分桶
一个分区按分桶方式被分成了多个桶 bucket,每个桶的数据称之为一个 tablet。
分桶方式:StarRocks 支持随机分桶(自 v3.1)和哈希分桶。
随机分桶,建表和新增分区时无需设置分桶键。在同一分区内,数据随机分布到不同的分桶中。
哈希分桶,建表和新增分区时需要指定分桶键。在同一分区内,数据按照分桶键划分分桶后,所有分桶键的值相同的行会唯一分配到对应的一个分桶。
分桶数量:默认由 StarRocks 自动设置分桶数量(自 v2.5.7)。同时也支持手动设置分桶数量。
2.3.2 创建分区
按照分区类型可以分为表达式分区、Range分区和List分区。
按照分区创建方式可以分为手动创建分区、批量创建分区和动态分区。
2.3.2.1 表达式分区
自 v3.0 起,StarRocks 支持表达式分区(原称自动创建分区),更加灵活易用,适用于大多数场景,比如按照连续日期范围或者枚举值来查询和管理数据。
仅需要在建表时使用分区表达式(时间函数表达式或列表达式),即可实现导入数据时自动创建分区,不需要预先创建出分区或者配置动态分区属性。
2.3.2.1.1 时间函数表达式分区(自v3.1)
如果经常按照连续日期范围来查询和管理数据,则只需要在时间函数分区表达式中,指定一个日期类型(DATE 或者 DATETIME )的分区列,以及指定分区粒度(年、月、日或小时)。StarRocks 会根据导入的数据和分区表达式,自动创建分区并且设置分区的起止时间。
不过在一些特殊场景下,比如历史数据按月划分分区、最近数据按天划分分区,则需要采用 Range 分区创建分区。
(一)语法
PARTITION BY expression
...
[ PROPERTIES( 'partition_live_number' = 'xxx' ) ]expression ::={ date_trunc ( <time_unit> , <partition_column> ) |time_slice ( <partition_column> , INTERVAL <N> <time_unit> [ , boundary ] ) }
(二)参数解释
注意:StarRocks 自动创建分区数量上限默认为 4096,由 FE 配置参数 max_automatic_partition_number 决定。该参数可以防止由于误操作而创建大量分区。
(三)示例
示例一:
假设经常按天查询数据,则建表时可以使用分区表达式 date_trunc() ,并且设置分区列为 event_day ,分区粒度为 day,实现导入数据时自动按照数据所属日期划分分区。将同一天的数据存储在一个分区中,利用分区裁剪可以显著提高查询效率。
CREATE TABLE test.site_express1 (event_day DATETIME NOT NULL,site_id INT DEFAULT '10',city_code VARCHAR(100),user_name VARCHAR(32) DEFAULT '',pv BIGINT DEFAULT '0'
)
DUPLICATE KEY(event_day, site_id, city_code, user_name)
PARTITION BY date_trunc('day', event_day)
DISTRIBUTED BY HASH(event_day, site_id)
PROPERTIES (
"replication_num" = "1"
);
导入如下两行数据,则 StarRocks 会根据导入数据的日期范围自动创建两个分区 p20230226、p20230227,范围分别为 [2023-02-26 00:00:00,2023-02-27 00:00:00)、[2023-02-27 00:00:00,2023-02-28 00:00:00)。如果后续导入数据的日期属于这两个范围,则都会自动划分至对应分区。
-- 导入两行数据
INSERT INTO test.site_access1 VALUES ("2023-02-26 20:12:04",002,"New York","Sam Smith",1),("2023-02-27 21:06:54",001,"Los Angeles","Taylor Swift",1);
查询分区
– 查询分区
SHOW PARTITIONS FROM test.site_express1;
示例二:
假设经常按周查询数据,则建表时可以使用分区表达式 time_slice(),设置分区列为 event_day,分区粒度为七天。将一周的数据存储在一个分区中,利用分区裁剪可以显著提高查询效率。
CREATE TABLE test.site_express2(event_day DATETIME NOT NULL,site_id INT DEFAULT '10',city_code VARCHAR(100),user_name VARCHAR(32) DEFAULT '',pv BIGINT DEFAULT '0'
)
DUPLICATE KEY(event_day, site_id, city_code, user_name)
PARTITION BY time_slice(event_day, INTERVAL 7 day)
DISTRIBUTED BY HASH(event_day, site_id)
PROPERTIES (
"replication_num" = "1"
);
导入如下几行数据,则 StarRocks 会根据导入数据的日期范围自动创建两个分区 p20230220、p20230227,范围分别为 [2023-02-20 00:00:00,2023-02-27 00:00:00)、[2023-02-27 00:00:00,2023-03-06 00:00:00)。如果后续导入数据的日期属于这两个范围,则都会自动划分至对应分区。
-- 导入三行数据
INSERT INTO test.site_express2VALUES ("2023-02-20 21:06:54",001,"Los Angeles","Taylor Swift",1),("2023-02-26 20:12:04",002,"New York","Sam Smith",1),("2023-02-27 21:06:54",003,"Los Angeles","Taylor Swift",1);
查询分区
SHOW PARTITIONS FROM test.site_express2;
2.3.2.1.2 列表达式分区(自v3.1)
如果经常按照枚举值来查询和管理数据,则只需要指定表示类型的列为分区列,StarRocks 会根据导入的数据的分区列值,来自动划分并创建分区。同Hive分区的用法。
不过在一些特殊场景下,比如表中包含表示城市的列,经常按照国家和城市来查询和管理数据,希望将同属于一个国家的多个城市的数据存储在一个分区中,则需要使用 List 分区。
(一)语法
PARTITION BY expression
...
[ PROPERTIES( 'partition_live_number' = 'xxx' ) ]expression ::=( <partition_columns> )partition_columns ::=<column>, [ <column> [,...] ]
(二)参数解释
(三)使用说明
(1)StarRocks 自动创建分区数量上限默认为 4096,由 FE 配置参数 max_automatic_partition_number 决定。该参数可以防止由于误操作而创建大量分区。
(2)分区命名规则:如果存在多个分区列,则不同分区列的值以下划线(_)连接。例如:存在有两个分区列 dt 和 city,均为字符串类型,导入一条数据 2022-04-01, beijing,则自动创建的分区名称为 p20220401_beijing。
(四)示例
假设经常按日期范围和特定城市查询机房收费明细,则建表时可以使用分区表达式指定分区列为日期 dt 和城市 city。这样属于相同日期和城市的数据分组到同一个分区中,利用分区裁剪可以显著提高查询效率。
CREATE TABLE test.recharge_express(id bigint,user_id bigint,recharge_money decimal(32,2), city varchar(20) not null,dt varchar(20) not null
)
DUPLICATE KEY(id)
PARTITION BY (dt,city)
DISTRIBUTED BY HASH(`id`)
PROPERTIES (
"replication_num" = "1"
);
导入一条数据。
INSERT INTO test.recharge_express
VALUES (1, 1, 1, 'Houston', '2022-04-01');
查看具体分区。返回结果显示,StarRocks 根据导入数据的分区列值自动创建一个分区 p20220401_Houston ,如果后续导入数据的分区列 dt 和 city 的值是 2022-04-01和 Houston,则都会被划分至该分区。
说明:分区中只能包含各分区列的一个值,如果需要一个分区中包含各分区列的多值,请使用 List 分区。
查询分区
SHOW PARTITIONS from test.recharge_express;
2.3.2.2 Range 分区
Range 分区适用于简单且具有连续性的数据,如时间序列数据(日期或时间戳)或连续的数值数据。并且经常按照连续日期/数值范围,来查询和管理数据。以及一些特殊场景,比如一张表的分区粒度不一致,历史数据需要按月划分分区,而最近数据需要按天划分分区。
StarRocks 会根据显式定义的范围与分区的映射关系将数据分配到相应的分区中。
示例:
CREATE TABLE test.site_access5(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"
);
2.3.2.3 List分区
自 v3.1 起,StarRocks 支持 List 分区,数据按照显式定义的枚举值列表进行分区,适用于按枚举值来查询和管理数据。
2.3.2.3.1 功能介绍
需要显式列出每个 List 分区所包含的枚举值列表,并且值不需要连续,区别于包含连续日期或者数值范围的 Range 分区。当新数据导入表中时,StarRocks 会根据数据的分区列值与分区的映射关系将数据分配到相应的分区中。
List 分区适用于存储具有少量枚举值列的数据、并且经常按列的枚举值来查询和管理数据的场景。例如表示地理位置、状态、类别的列。列的每个值都代表一种独立的类别。按照列的枚举值对数据进行分区,可以提高查询性能和方便数据管理。
尤其适用于一个分区中需要包含各分区列的多个值的场景。例如表中存在 City 列表示个体所属的城市,并且经常按照州和城市查询和管理数据,则建表时可以使用 City 列作为分区列进行 List 分区,指定同属一个州的多个城市的数据分在同一分区 PARTITION pCalifornia VALUES IN (“Los Angeles”,“San Francisco”,“San Diego”),可以加速查询和方便数据管理。
2.3.2.3.2 使用方式
2.3.2.3.2.1 语法
PARTITION BY LIST (partition_columns)(PARTITION <partition_name> VALUES IN (value_list)[, ...]
)partition_columns::= <column> [,<column> [, ...] ]value_list ::=value_item [, value_item [, ...] ]value_item ::={ <value> | ( <value> [, <value>, [, ...] ] ) }
2.3.2.3.2.2 参数说明
2.3.2.3.2.3 示例
示例一
假设经常按照州或城市查询机房收费明细,则建表时可以指定分区列为城市 city ,并且指定每个分区所包含城市同属一个州,这样可以加速查询特定州或城市的数据,并且方便按照特定州或城市进行数据管理。
CREATE TABLE test.recharge_list(id bigint,user_id bigint,recharge_money decimal(32,2), city varchar(20) not null,dt varchar(20) not null
)
DUPLICATE KEY(id)
PARTITION BY LIST (city) (PARTITION pCalifornia VALUES IN ("Los Angeles","San Francisco","San Diego"), -- 这些城市同属一个州PARTITION pTexas VALUES IN ("Houston","Dallas","Austin")
)
DISTRIBUTED BY HASH(`id`)
PROPERTIES (
"replication_num" = "1"
);
示例二
假设经常按日期范围和特定州或城市查询机房收费明细,则建表时可以指定分区列为日期 dt 和城市 city。这样属于特定日期和特定州或城市的数据分组到同一个分区中,以加速查询和方便数据管理。
CREATE TABLE test.recharge_list2(id bigint,user_id bigint,recharge_money decimal(32,2), city varchar(20) not null,dt varchar(20) not null
)
DUPLICATE KEY(id)
PARTITION BY LIST (dt,city) (PARTITION p202204_California VALUES IN (("2022-04-01", "Los Angeles"),("2022-04-01", "San Francisco"),("2022-04-02", "Los Angeles"),("2022-04-02", "San Francisco")),PARTITION p202204_Texas VALUES IN (("2022-04-01", "Houston"),("2022-04-01", "Dallas"),("2022-04-02", "Houston"),("2022-04-02", "Dallas"))
)
DISTRIBUTED BY HASH(`id`)
PROPERTIES (
"replication_num" = "1"
);
2.3.2.3.3 使用限制
不支持动态和批量创建 List 分区。
StarRocks 存算分离模式从 3.1.1 版本开始支持该功能。
使用 ALTER TABLE <table_name> DROP PARTITION <partition_name>; 分区直接被删除并且不能被恢复。
List 分区暂时不支持备份与恢复。
异步物化视图暂不支持基于使用 List 分区的基表创建。
2.3.2.4 手动创建分区
选择合理的分区键可以有效的裁剪扫描的数据量。目前仅支持分区键的数据类型为日期和整数类型。在实际业务场景中,一般从数据管理的角度选择分区键,常见的分区键为时间或者区域。
如上面range分区创建的test.site_access5
2.3.2.5 批量创建分区
建表时和建表后,支持批量创建分区,通过 START、END 指定批量分区的开始和结束,EVERY 子句指定分区增量值。其中,批量分区包含 START 的值,但是不包含 END 的值。分区的命名规则同动态分区一样。
建表时批量创建日期分区
当分区键为日期类型时,建表时通过 START、END 指定批量分区的开始日期和结束日期,EVERY 子句指定分区增量值。并且 EVERY 子句中用 INTERVAL 关键字表示日期间隔,目前支持日期间隔的单位为 HOUR(自 3.0 版本起)、DAY、WEEK、MONTH、YEAR。
如下示例中,批量分区的开始日期为 2021-01-01 和结束日期为 2021-01-04,增量值为一天:
CREATE TABLE test.site_access6(datekey DATE,site_id INT,city_code SMALLINT,user_name VARCHAR(32),pv BIGINT DEFAULT '0'
)
DUPLICATE KEY(datekey, site_id, city_code, user_name)
PARTITION BY RANGE (datekey) (START ("2021-01-01") END ("2021-01-04") EVERY (INTERVAL 1 DAY)
)
DISTRIBUTED BY HASH(site_id)
PROPERTIES ("replication_num" = "1"
);
则相当于在建表语句中使用如下 PARTITION BY 子句:
PARTITION BY RANGE (datekey) (PARTITION p20210101 VALUES [('2021-01-01'), ('2021-01-02')),PARTITION p20210102 VALUES [('2021-01-02'), ('2021-01-03')),PARTITION p20210103 VALUES [('2021-01-03'), ('2021-01-04'))
)
建表时批量创建不同日期间隔的日期分区
建表时批量创建日期分区时,支持针对不同的日期分区区间(日期分区区间不能相重合),使用不同的 EVERY 子句指定日期间隔。一个日期分区区间,按照对应 EVERY 子句定义的日期间隔,批量创建分区,例如:
CREATE TABLE test.site_access7(datekey DATE,site_id INT,city_code SMALLINT,user_name VARCHAR(32),pv BIGINT DEFAULT '0'
)
DUPLICATE KEY(datekey, site_id, city_code, user_name)
PARTITION BY RANGE (datekey) (START ("2019-01-01") END ("2021-01-01") EVERY (INTERVAL 1 YEAR),START ("2021-01-01") END ("2021-05-01") EVERY (INTERVAL 1 MONTH),START ("2021-05-01") END ("2021-05-04") EVERY (INTERVAL 1 DAY)
)
DISTRIBUTED BY HASH(site_id)
PROPERTIES ("replication_num" = "1"
);
则相当于在建表语句中使用如下 PARTITION BY 子句:
PARTITION BY RANGE (datekey) (PARTITION p2019 VALUES [('2019-01-01'), ('2020-01-01')),PARTITION p2020 VALUES [('2020-01-01'), ('2021-01-01')),PARTITION p202101 VALUES [('2021-01-01'), ('2021-02-01')),PARTITION p202102 VALUES [('2021-02-01'), ('2021-03-01')),PARTITION p202103 VALUES [('2021-03-01'), ('2021-04-01')),PARTITION p202104 VALUES [('2021-04-01'), ('2021-05-01')),PARTITION p20210501 VALUES [('2021-05-01'), ('2021-05-02')),PARTITION p20210502 VALUES [('2021-05-02'), ('2021-05-03')),PARTITION p20210503 VALUES [('2021-05-03'), ('2021-05-04'))
)
建表时批量创建数字分区
当分区键为整数类型时,建表时通过 START、END 指定批量分区的开始值和结束值,EVERY 子句指定分区增量值。
说明:START、END 所指定的分区列的值需要使用英文引号包裹,而 EVERY 子句中的分区增量值不用英文引号包裹。
如下示例中,批量分区的开始值为 1 和结束值为 5,分区增量值为 1:
CREATE TABLE test.site_access8(datekey INT,site_id INT,city_code SMALLINT,user_name VARCHAR(32),pv BIGINT DEFAULT '0'
)
DUPLICATE KEY(datekey, site_id, city_code, user_name)
PARTITION BY RANGE (datekey) (START ("1") END ("5") EVERY (1)
)
DISTRIBUTED BY HASH(site_id)
PROPERTIES ("replication_num" = "1"
);
则相当于在建表语句中使用如下 PARTITION BY 子句:
PARTITION BY RANGE (datekey) (PARTITION p1 VALUES [("1"), ("2")),PARTITION p2 VALUES [("2"), ("3")),PARTITION p3 VALUES [("3"), ("4")),PARTITION p4 VALUES [("4"), ("5"))
)
建表后批量创建分区
建表后,支持通过ALTER TABLE 语句批量创建分区。相关语法与建表时批量创建分区类似,通过指定 ADD PARTITIONS 关键字,以及 START、END 以及 EVERY 子句来批量创建分区。示例如下:
ALTER TABLE test.site_access8
ADD PARTITIONS START (“5”) END (“9”) EVERY (2);
2.3.2.6 动态分区
建表时配置动态分区属性,StarRocks 会⾃动提前创建新的分区,删除过期分区,从而确保数据的时效性,实现对分区的⽣命周期管理(Time to Life,简称 “TTL”)。
区别于表达式分区中自动创建分区功能,动态创建分区只是根据配置的动态分区属性,定期提前创建一些分区。如果导入的新数据不属于这些提前创建的分区,则导入任务会报错。而表达式分区中自动创建分区功能会根据导入数据创建对应的新分区。
如下示例,创建一张支持动态分区的表,表名为 site_access,动态分区通过 PROPERTIES 进行配置。分区的区间为当前时间的前后 3 天,总共 6 天。手动创建的4个分区p20200321~p20200324,因为过期会被删除。
注意:starrocks 的EMR Serverless StarRocks版本默认 dynamic_partition_enable 为true,所以不需要再手动设置。
CREATE TABLE test.site_access_dynamic(event_day DATE,site_id INT DEFAULT '10',city_code VARCHAR(100),user_name VARCHAR(32) DEFAULT '',pv BIGINT DEFAULT '0'
)
DUPLICATE KEY(event_day, site_id, city_code, user_name)
PARTITION BY RANGE(event_day)(
PARTITION p20200321 VALUES LESS THAN ("2020-03-22"),
PARTITION p20200322 VALUES LESS THAN ("2020-03-23"),
PARTITION p20200323 VALUES LESS THAN ("2020-03-24"),
PARTITION p20200324 VALUES LESS THAN ("2020-03-25")
)
DISTRIBUTED BY HASH(event_day, site_id)
PROPERTIES("dynamic_partition.time_unit" = "DAY","dynamic_partition.start" = "-3","dynamic_partition.end" = "3","dynamic_partition.prefix" = "p","dynamic_partition.history_partition_num" = "3","replication_num" = "1"
);
动态分区相关属性 PROPERTIES:
动态分区相关 FE 配置项:
dynamic_partition_check_interval_seconds:FE 配置项,动态分区检查的时间周期,默认为 600,单位为 s,即每10分钟检查一次分区情况是否满足PROPERTIES中动态分区属性,如不满足,则会自动创建和删除分区。
相关文章:

Flink-StarRocks详解:第三部分StarRocks分区分桶(第53天)
文章目录 前言2.3 数据分布2.3.1 数据分布概览2.3.1.1 常见的数据分布方式2.3.1.2 StarRocks的数据分布方式2.3.1.3 分区2.3.1.4 分桶 2.3.2 创建分区2.3.2.1 表达式分区2.3.2.1.1 时间函数表达式分区(自v3.1)2.3.2.1.2 列表达式分区(自v3.1&…...

8G内存的Mac够用吗 ?苹果电脑内存满了怎么清理?可以有效地管理和优化你的Mac电脑内存,确保设备运行流畅
嘿,朋友们,让咱们聊聊怎么让我们的Mac小伙伴时刻保持巅峰状态吧!想象一下,每一次点击、每一次滑动,都如同初见时那般丝滑顺畅,是不是超级心动?为了这份持久的畅快体验,我强烈推荐大家…...

【LabVIEW学习篇 - 10】:属性、调用节点
文章目录 属性节点调用节点使用方法一使用方法二案例 练习 属性节点 LabVIEW中的对象(包括控件、VI、应用程序等)都有自己的属性和方法。属性就是对象与生俱来的一些特性,可以理解成它是静态的,如控件的背景颜色,坐标…...

如何在数据埋点中发现和修复数据上报逻辑错误
如何发现和处理数据埋点中的逻辑错误 在大数据分析中,数据埋点是至关重要的一环。然而,当我们遇到数据上报逻辑错误时,该如何应对呢?本文将为你揭示解决这一棘手问题的有效方法。 目录 如何发现和处理数据埋点中的逻辑错误什么是数据上报逻辑错误?如何发现数据上报逻辑错误…...
程序员面试“八股文”:助力成长还是应试枷锁?
程序员面试“八股文”:助力成长还是应试枷锁? 引言 在当今快速迭代的IT行业中,程序员面试作为选拔人才的关键环节,其内容与形式一直备受关注。其中,“八股文”式面试题,作为一类标准化、模式化的问题集合…...
强化学习-alphazero 算法理论
一、算法简介 简单地说,AlphazeroMCTS SL(策略网络价值网络) Selfplay resnet。 其中MCTS指的是蒙特卡洛树搜索,主要用于记录所有访问过的棋盘状态的各种属性,包括该状态访问次数,对该状平均评价分数等。 SL指监督学习算法&…...

使用 Rough.js 创建动态水平条形图
本文由ScriptEcho平台提供技术支持 项目地址:传送门 使用 Rough.js 创建动态可视化网络图 应用场景 Rough.js 是一个 JavaScript 库,它允许开发人员使用毛边风格创建可视化效果。该库适用于各种应用程序,例如: 数据可视化地图…...

Python教程(十):面向对象编程(OOP)
目录 专栏列表前言一、面向对象编程概述1.1 类和对象1.2 继承1.3 多态1.4 封装 二、Python 中的类和对象2.1 定义类2.2 __init__ 函数解释2.3 创建对象 三、继承3.1 基本继承3.2 创建子类对象 四、多态五、封装六. 访问限制七、综合实例结语 专栏列表 Python教程(一…...

CTFHUB-文件上传-文件头检查
开启题目 1.php内容: <?php eval($_POST[cmd]);?> 截屏截一个很小很小的图片,保存为 png 格式,把 1.png 和 1.php 放在同一文件夹,在此目录打开 cmd, 使用以下命令把 1.png 和 1.php 合成为图片马 copy 1.pn…...
c语言数组与指针,字符串与指针,指向函数的指针,malloca动态内存分配
数组与指针 数组: - 数组是一种数据结构,可以存储固定大小的一组相同类型的元素。在内存中,数组的元素是连续存储的。 指针: - 指针是一个变量,用于存储内存地址。指针本身占用内存,用来指向某个数据的地址。 数组与指针的关系…...

代码随想录算法训练营day30 | 452. 用最少数量的箭引爆气球 、435. 无重叠区间、763.划分字母区间
碎碎念:加油 参考:代码随想录 452. 用最少数量的箭引爆气球 题目链接 452. 用最少数量的箭引爆气球 思想 局部最优: 让重叠的气球尽量在一起,用一支弓箭射。 全局最优: 用最少数量的箭引爆气球。 首先对气球进行排…...

如何手动修复DLL丢失?2种手动修复dll文件方法
DLL(动态链接库)文件是Windows操作系统中非常重要的组成部分,它们包含了程序运行所需的代码和数据。然而,由于各种原因,如系统更新、软件卸载不当或病毒感染,DLL文件有时会丢失或损坏,导致程序无…...

Node.js(2)——压缩前端html
需求:把回车符(\r)和换行符(\n)去掉后,写入到新的html文件中 步骤: 读取源html文件内容正则替换字符串写入到新的html文件中 示例: 获取html文件中的内容并检查(同时…...
堆的实现-向上调整算法-向下调整算法-堆排序-TopK问题 C语言
堆的实现与堆排序及TopK问题的C语言代码 下面是详细的堆实现,包括向上调整、向下调整算法,以及堆排序和解决TopK问题的完整C语言示例代码。 1. 堆的实现 首先,定义堆的数据结构: #include <stdio.h> #include <stdli…...

【C++BFS】1466. 重新规划路线
本文涉及知识点 CBFS算法 LeetCode1466. 重新规划路线 n 座城市,从 0 到 n-1 编号,其间共有 n-1 条路线。因此,要想在两座不同城市之间旅行只有唯一一条路线可供选择(路线网形成一颗树)。去年,交通运输部…...

服务器并发模型
服务器: 单循环服务器:服务器在同一时刻只能响应一个客户端的请求 并发服务器模型:服务器在同一时刻可以响应多个客户端的请求 UDP:无连接 TCP:有连接 1.多进程 资源空间消耗大 效率低 2.多线程 相…...

Chapter 23 数据可视化——地图
欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、基础绘图二、视觉映射三、案例分析 前言 随着地理信息系统(GIS)技术的迅猛发展和大数据时代的到来,数据可视化已经成为分析和理…...

Linux笔记 --- 组合数据类型
结构体 简单的定义结构体的方法 struct student {char name;int age;float score; };//使用student模板创建两个结构体变量 struct student Jack,Rose; 结构体中可以存放除了函数以外的任何数据类型的数据,在创建结构体时student被称为结构体模板名称,…...
DaoCloud-Dockfile文件NGINX文件
Dockfile文件 安装依赖,打包,配置NGINX代理,最后把打完的包复制到服务器相应的文件夹下,构建镜像成功。 # syntax docker/dockerfile:experimental FROM xx.xx.xx.xx/public/node:16.14.2 as builder# LABEL maintainer"e…...
耳机行业中MIC ENC
0 Preface/Foreword ENC: Environment Noise Cancellation,环境降噪,主要指在通话过程中,戴着ENC通话降噪耳机的使用者,即使在嘈杂的环境,比如在嘈杂的街区,开着窗运行的汽车上,说话…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...

什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...

归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...