【大数据】Spark弹性分布式数据集RDD详细说明
文章目录
- 整体介绍
- 一、定义与特性
- 二、操作与转换
- 三、存储级别与持久化
- 四、依赖关系与容错机制
- 五、优化与性能调优
- 常见操作
- 支持的数据格式
- 1.文本文件 (Text Files)
- 2. CSV 文件
- 3. JSON 文件
- 4. Parquet 文件
- 5. Sequence Files
- 6.Hadoop文件读取
- A. 读取HDFS上的文本文件
- B. 使用Hadoop的InputFormat读取数据
- 注意事项
- 一个完整代码示例
- RDD、Datasets和DataFrame的对比
整体介绍
弹性分布式数据集RDD(Resilient Distributed Dataset)是Apache Spark中最基本的数据抽象,代表一个不可变、可分区、元素可以并行计算的数据集合。以下是对RDD的详细说明:
一、定义与特性
-
定义:RDD是Spark对数据集的抽象,用于存放数据,它表示一个只读的、可分区的、其中元素可进行并行计算的集合,并且是可跨越集群节点进行并行操作的有容错机制的集合。
-
特性:
- 基于内存计算:RDD通过将数据加载到内存中,提高了数据处理的效率。相比于传统的磁盘存储,内存(RAM)的读写速度更快,因此RDD适用于需要快速迭代计算的任务。
- 惰性计算:RDD的转换操作是惰性的,即它们不会立即执行,而是等到真正需要结果时才触发计算。这种机制使得Spark能够优化执行计划,提高性能。
- 容错性:RDD采用基于血缘的高效容错机制。在RDD的设计中,数据是只读的不可修改,如果需要修改数据,必须从父RDD转换生成新的子RDD,由此在不同的RDD之间建立血缘关系。因此RDD是天生具有高容错机制的特殊集合,当一个RDD失效的时候,只需要通过重新计算上游的父RDD来重新生成丢失的RDD数据,而不需要通过数据冗余的方式实现容错。
- 不可变性:一旦创建,RDD的内容就不能被修改。这种不可变性有助于实现数据的容错性和并行性。
- 可分区性:RDD可以将数据集划分为多个分区,每个分区可以独立地进行操作,从而实现并行处理。分区数决定了数据如何被分配到集群中的计算节点,合适的分区数可以提高计算效率和资源利用率。
二、操作与转换
-
创建RDD:
- 可以从已存在的集合(如列表或数组)创建RDD。
- 可以从外部数据源(如HDFS、本地文件系统、Hive表等)读取数据创建RDD。
- 可以使用已存在的RDD来创建新的RDD,通过对现有RDD进行转换操作。
-
RDD转换(Transformations):
- 转换操作用于从一个RDD生成新的RDD,通常是通过映射、过滤、合并等方式进行数据转换。常见的转换操作包括
map
、filter
、flatMap
、reduceByKey
等。 - 转换操作是惰性的,不会立即执行计算,而是等到行动操作被触发时才执行。
- 转换操作用于从一个RDD生成新的RDD,通常是通过映射、过滤、合并等方式进行数据转换。常见的转换操作包括
-
RDD行动(Actions):
- 行动操作用于触发实际的计算,将RDD的结果返回到驱动程序或保存到外部存储系统。常见的行动操作包括
collect
、count
、saveAsTextFile
等。 - 只有当行动操作被触发时,Spark才会根据依赖关系图计算RDD的结果。
- 行动操作用于触发实际的计算,将RDD的结果返回到驱动程序或保存到外部存储系统。常见的行动操作包括
三、存储级别与持久化
- 存储级别:RDD的存储级别决定了数据在内存和磁盘之间的存储方式。常见的存储级别包括
MEMORY_ONLY
(仅在内存中存储)、MEMORY_AND_DISK
(在内存中存储,不够时写入磁盘)、DISK_ONLY
(仅在磁盘中存储)等。 - 持久化:可以使用
cache
或persist
方法将RDD存储在内存中,以供多次计算使用。持久化可以提高数据处理的效率,减少重复计算的时间。
四、依赖关系与容错机制
- 依赖关系:RDD之间的转换操作会创建依赖关系,这些依赖关系决定了数据如何在整个集群中流动。依赖关系分为窄依赖和宽依赖两种。
- 窄依赖:子RDD的每个分区依赖于父RDD的一个分区。
- 宽依赖:子RDD的每个分区可能依赖于父RDD的所有分区,这通常需要进行shuffle操作。
- 容错机制:RDD的容错机制基于其血缘信息和不可变性。当一个RDD的某个分区的数据计算失败时,Spark可以使用原始数据和转换操作重新计算该分区,从而实现容错。
五、优化与性能调优
- 合理使用缓存:通过缓存常用的RDD,可以减少重复计算的时间,提高数据处理的效率。
- 选择合适的分区器:根据数据的特征和计算任务的需求,选择合适的分区器可以优化数据的存储和计算过程。
- 调整分区数量:根据集群的配置和计算任务的需求,调整RDD的分区数量可以提高计算效率和资源利用率。
综上所述,RDD是Spark中最重要的抽象之一,它为分布式数据处理提供了一个强大而灵活的模型。通过理解和使用RDD的特性、操作、存储级别、依赖关系以及优化方法,可以构建高效的数据处理流程,并充分利用Spark集群的计算资源。
常见操作
以下是RDD(弹性分布式数据集)的操作及其说明的表格形式展示:
RDD操作 | 说明 | 示例 |
---|---|---|
创建操作 | ||
sc.parallelize | 从本地集合创建RDD | val rdd = sc.parallelize(1 to 10) |
sc.textFile | 从外部文件创建RDD | val rdd = sc.textFile(“hdfs://…”) |
转换操作(Transformation) | 返回一个新的RDD | |
map | 对RDD中的每个元素应用一个函数 | val mappedRdd = rdd.map(x => x * 2) |
filter | 过滤RDD中的元素,返回满足条件的元素 | val filteredRdd = rdd.filter(_ > 5) |
flatMap | 类似于map,但每个输入元素可以映射到0或多个输出元素 | val flatMappedRdd = rdd.flatMap(x => 1 to x) |
mapPartitions | 对RDD的每个分区应用一个函数 | val mapPartitionsRdd = rdd.mapPartitions(iter => iter.map(_ * 2)) |
mapPartitionsWithIndex | 对RDD的每个分区及其索引应用一个函数 | val indexedRdd = rdd.mapPartitionsWithIndex((index, iter) => iter.map(x => (index, x))) |
reduceByKey | 对键值对RDD中相同键的值进行归约 | val reducedRdd = rdd.reduceByKey(_ + _) |
groupByKey | 对键值对RDD中相同键的值进行分组 | val groupedRdd = rdd.groupByKey() |
sortByKey | 对键值对RDD的键进行排序 | val sortedRdd = rdd.sortByKey() |
join | 对两个键值对RDD中相同键的值进行内连接 | val joinedRdd = rdd1.join(rdd2) |
cogroup | 对两个键值对RDD中相同键的值进行分组,并返回每个键对应的两个值集合 | val cogroupedRdd = rdd1.cogroup(rdd2) |
行动操作(Action) | 向驱动程序返回结果或写入外部系统 | |
collect | 将RDD的所有元素收集到驱动程序中 | val collected = rdd.collect() |
count | 返回RDD中元素的个数 | val count = rdd.count() |
take | 返回RDD中的前n个元素 | val taken = rdd.take(5) |
saveAsTextFile | 将RDD的内容保存到文本文件中 | rdd.saveAsTextFile(“hdfs://…”) |
foreach | 对RDD中的每个元素应用一个函数(通常用于副作用) | rdd.foreach(println) |
请注意,以上表格仅列出了RDD的一些常见操作,并非全部。RDD的操作非常丰富,可以根据具体需求选择合适的操作来处理数据。同时,RDD的操作具有惰性特性,即转换操作不会立即执行,而是等到行动操作被触发时才执行。这种机制有助于优化计算过程,提高性能。
支持的数据格式
Apache Spark 的 Resilient Distributed Datasets (RDDs) 支持多种数据格式的读取。以下是一些常见的数据格式及其对应的 Java 代码样例:
1.文本文件 (Text Files)
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.SparkConf;public class TextFileRDD {public static void main(String[] args) {SparkConf conf = new SparkConf().setAppName("TextFileRDD").setMaster("local");JavaSparkContext sc = new JavaSparkContext(conf);// 读取文本文件JavaRDD<String> textFile = sc.textFile("path/to/textfile.txt");// 打印前10行textFile.take(10).forEach(System.out::println);sc.stop();}
}
2. CSV 文件
Spark 官方没有直接提供 CSV 文件的读取功能,但你可以使用 spark-csv
库(Spark 2.0 及以前)或者 DataFrameReader
(Spark 2.0 及以后)来读取 CSV 文件。
使用 DataFrameReader 读取 CSV 文件:
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;public class CSVFileRDD {public static void main(String[] args) {SparkSession spark = SparkSession.builder().appName("CSVFileRDD").master("local").getOrCreate();// 读取CSV文件Dataset<Row> csvDF = spark.read().option("header", "true").csv("path/to/csvfile.csv");// 显示内容csvDF.show();spark.stop();}
}
3. JSON 文件
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;public class JSONFileRDD {public static void main(String[] args) {SparkSession spark = SparkSession.builder().appName("JSONFileRDD").master("local").getOrCreate();// 读取JSON文件Dataset<Row> jsonDF = spark.read().json("path/to/jsonfile.json");// 显示内容jsonDF.show();spark.stop();}
}
4. Parquet 文件
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;public class ParquetFileRDD {public static void main(String[] args) {SparkSession spark = SparkSession.builder().appName("ParquetFileRDD").master("local").getOrCreate();// 读取Parquet文件Dataset<Row> parquetDF = spark.read().parquet("path/to/parquetfile.parquet");// 显示内容parquetDF.show();spark.stop();}
}
5. Sequence Files
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.SparkConf;
import scala.Tuple2;public class SequenceFileRDD {public static void main(String[] args) {SparkConf conf = new SparkConf().setAppName("SequenceFileRDD").setMaster("local");JavaSparkContext sc = new JavaSparkContext(conf);// 读取SequenceFileJavaPairRDD<IntWritable, Text> sequenceFile = sc.sequenceFile("path/to/sequencefile", IntWritable.class, Text.class);// 打印键值对sequenceFile.collect().forEach(tuple -> System.out.println(tuple._1() + " : " + tuple._2()));sc.stop();}
}
6.Hadoop文件读取
在Apache Spark中读取Hadoop数据通常涉及访问存储在Hadoop分布式文件系统(HDFS)上的数据,或者通过Hadoop的输入格式(InputFormat)读取数据。以下是一些使用Spark读取Hadoop数据的Java代码示例:
A. 读取HDFS上的文本文件
这是最简单的情况,因为Spark可以直接通过textFile
方法读取HDFS上的文本文件,就像读取本地文件系统上的文件一样。
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.SparkConf;public class HDFSTextFileReader {public static void main(String[] args) {SparkConf conf = new SparkConf().setAppName("HDFSTextFileReader").setMaster("local");JavaSparkContext sc = new JavaSparkContext(conf);// 假设HDFS上的文件路径为hdfs://namenode:port/path/to/textfile.txtString hdfsFilePath = "hdfs://namenode:port/path/to/textfile.txt";JavaRDD<String> textFile = sc.textFile(hdfsFilePath);// 处理数据,例如打印前10行textFile.take(10).forEach(System.out::println);sc.stop();}
}
B. 使用Hadoop的InputFormat读取数据
对于存储在Hadoop中的非文本数据,或者需要更复杂的数据解析,你可以使用Hadoop的InputFormat。这通常涉及创建一个Hadoop配置对象,并设置必要的属性,然后使用Spark的newAPIHadoopFile
或newAPIHadoopRDD
方法。
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.SparkConf;
import scala.Tuple2;public class HadoopInputFormatReader {public static void main(String[] args) throws Exception {SparkConf conf = new SparkConf().setAppName("HadoopInputFormatReader").setMaster("local");JavaSparkContext sc = new JavaSparkContext(conf);// 创建Hadoop配置对象Configuration hadoopConf = new Configuration();Job job = Job.getInstance(hadoopConf, "Read from Hadoop InputFormat");job.setJarByClass(HadoopInputFormatReader.class);// 设置输入路径FileInputFormat.addInputPath(job, new Path("hdfs://namenode:port/path/to/hadoopfile"));// 使用newAPIHadoopRDD读取数据JavaPairRDD<LongWritable, Text> hadoopRDD = sc.newAPIHadoopRDD(hadoopConf,job.getInputFormatClass(),LongWritable.class,Text.class);// 处理数据,例如打印键值对hadoopRDD.collect().forEach(tuple -> System.out.println(tuple._1() + " : " + tuple._2().toString()));sc.stop();}
}
在这个例子中,我们假设Hadoop文件是使用LongWritable
作为键(通常是偏移量)和Text
作为值(行内容)存储的。你需要根据你的Hadoop文件格式调整键和值的类型。
注意事项
- Hadoop配置:确保你的Hadoop配置(如
core-site.xml
和hdfs-site.xml
)在Spark的classpath中,或者通过编程方式设置必要的配置属性。 - 依赖项:在你的项目中包含Hadoop和Spark的依赖项。
- HDFS访问:确保Spark能够访问HDFS。这通常意味着Spark集群的节点需要配置为能够访问HDFS的namenode和datanode。
- 性能考虑:对于大规模数据集,避免使用
collect()
方法将数据从集群拉取到驱动程序。相反,使用转换和行动操作在集群上处理数据。
这些示例展示了如何使用 Java 代码在 Spark 中读取不同类型的文件。根据具体需求,你可能需要调整路径、选项和其他参数。
一个完整代码示例
以下是一个使用Java编写的基本RDD(弹性分布式数据集)代码示例,该示例展示了如何在Apache Spark中创建RDD、执行转换操作以及行动操作。
首先,请确保您已经设置好Spark环境,并导入了必要的Spark库。
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import java.util.Arrays;
import java.util.List;public class RDDExample {public static void main(String[] args) {// 配置SparkSparkConf conf = new SparkConf().setAppName("RDD Example").setMaster("local");JavaSparkContext sc = new JavaSparkContext(conf);// 从本地集合创建RDDList<Integer> data = Arrays.asList(1, 2, 3, 4, 5);JavaRDD<Integer> rdd = sc.parallelize(data);// 转换操作:将每个元素乘以2JavaRDD<Integer> transformedRDD = rdd.map(x -> x * 2);// 行动操作:收集RDD中的所有元素并打印List<Integer> collectedData = transformedRDD.collect();for (Integer num : collectedData) {System.out.println(num);}// 关闭Spark上下文sc.close();}
}
在这个示例中,我们:
- 配置了Spark环境,并创建了一个
JavaSparkContext
对象,它是与Spark集群交互的主要入口点。 - 使用
sc.parallelize
方法从本地集合创建了一个RDD。 - 对RDD执行了一个转换操作,使用
map
函数将RDD中的每个元素乘以2。 - 使用
collect
行动操作将转换后的RDD收集到驱动程序中,并打印出结果。 - 最后,关闭了Spark上下文以释放资源。
请注意,setMaster("local")
配置意味着Spark将在本地模式下运行,仅使用一个线程。如果您想在集群上运行此代码,请将setMaster
的值更改为集群管理器(如YARN、Mesos或Spark Standalone)的URL。
此外,由于collect
操作会将数据从集群节点收集到驱动程序中,因此在处理大量数据时可能会导致内存溢出。在实际应用中,应谨慎使用此类行动操作,并考虑使用其他行动操作(如saveAsTextFile
)将结果写入外部存储系统。
RDD、Datasets和DataFrame的对比
以下是RDD、Datasets和DataFrame的对比表格,展示了它们之间的主要区别和特性:
特性/组件 | RDD | DataFrame | Datasets |
---|---|---|---|
基础 | 弹性分布式数据集,Spark最基础的数据结构 | 分布式数据集合,带有Schema元信息的二维表格 | 结构化API的基本类型,基于DataFrame的扩展 |
数据格式 | 可处理结构化或非结构化数据 | 仅使用结构化和半结构化数据 | 可处理结构化或非结构化数据 |
Schema信息 | 需要手动定义 | 可以根据数据自动发现 | 可以自动发现文件的Schema信息 |
类型安全 | 编译时类型安全性较弱,主要在运行时检测属性错误 | 提供编译时类型安全性 | 提供编译时类型安全性,且支持强类型、面向对象编程的接口 |
序列化 | 使用Java序列化,开销较大 | 使用off-heap内存减少开销,动态生成字节码 | 使用Spark内部的Tungsten二进制格式进行序列化,无需垃圾回收 |
优化 | 无内置优化引擎,不能使用Spark高级优化器 | 使用Catalyst优化器进行查询优化 | 使用优化器优化执行计划 |
API支持 | 提供Java、Scala、Python和R语言的API | 提供Java、Scala、Python和R语言的API | Scala和Java支持较完善,Python和R语言的API在开发中 |
操作便捷性 | 底层操作,需要手动管理Schema和分区 | 高级抽象,易于使用,支持SQL操作 | 兼具DataFrame的便捷性和RDD的功能性 |
适用场景 | 需要对数据集进行底层转换和操作时 | 需要高级抽象和便捷操作时,如探索性分析和汇总统计 | 需要类型安全和自定义结构时,如处理复杂数据类型和转换 |
这个表格概括了RDD、DataFrame和Datasets在Spark中的主要特性和区别。RDD提供了最底层的数据抽象,适用于需要细粒度控制和自定义操作的场景。DataFrame则提供了更高层次的抽象,易于使用且支持SQL操作,适用于数据分析和探索性场景。Datasets则结合了RDD和DataFrame的优点,提供了类型安全和面向对象编程的接口,适用于需要处理复杂数据类型和转换的场景。在选择使用哪个组件时,需要根据具体的应用场景和需求来决定。
相关文章:

【大数据】Spark弹性分布式数据集RDD详细说明
文章目录 整体介绍一、定义与特性二、操作与转换三、存储级别与持久化四、依赖关系与容错机制五、优化与性能调优 常见操作支持的数据格式1.文本文件 (Text Files)2. CSV 文件3. JSON 文件4. Parquet 文件5. Sequence Files6.Hadoop文件读取A. 读取HDFS上的文本文件B. 使用Hado…...

人参玉桂膏简介
一、产品基本信息 产品名称:人参玉桂膏 产品类别:植物饮料(专为特定体质设计) 配料:精选薏苡仁、荷叶、玉米须、赤小豆等纯然植物成分,辅以麦芽糖醇液、低聚果糖调节口感,陈皮、肉桂、人参&…...

消费者Rebalance机制
优质博文:IT-BLOG-CN 一、消费者Rebalance机制 在Apache Kafka中,消费者组 Consumer Group会在以下几种情况下发生重新平衡Rebalance: 【1】消费者加入或离开消费者组: 当一个新的消费者加入消费者组或一个现有的消费者离开消费…...

消息队列介绍
一、ActiveMQ 优点:性能单台(6000)成熟,已经在很多公司得到应用。各种协议支持好,有多个语言的成熟客户端 缺点:性能较弱,缺乏大规模吞吐的场景的应用,有江河日下之感 二、RabbitMQ…...

告别@Value,Spring Boot 3.3更优雅的配置注入方案
在Spring Boot的早期版本中,我们常使用Value注解来注入配置文件中的属性值。然而,这种方式虽然简单直接,却存在一些局限,比如它只能注入基本类型的值,并且需要显式地在每个需要注入的字段上使用注解。随着Spring Boot的…...

甲虫身体图像分割系统源码&数据集分享
甲虫身体图像分割系统源码&数据集分享 [yolov8-seg-EfficientRepBiPAN&yolov8-seg-C2f-FocusedLinearAttention等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challen…...

Qt - QMenu
QMenu 1、menu转string输出 //GlobalEnum.h #include <QObject> #include <QMetaEnum> class GlobalEnum : public QObject {Q_OBJECT public:EnumTest();enum Enum_Test{ZhangSan 0,WangWu,};Q_ENUM(Enum_Test) };#define EnumToString(e) \ QMetaEnum::fromTy…...

舵机驱动详解(模拟/数字 STM32)
目录 一、介绍 二、模块原理 1.舵机驱动原理 2.引脚描述 三、程序设计 main.c文件 servo.h文件 servo.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 舵机(Servo)是在程序的控制下,在一定范围内连续改变输出轴角度并保持的电机系统。即舵机只支持…...

dvwa:文件包含、文件上传
文件包含 本地文件包含(敏感信息泄露)和远程文件包含(命令执行) 本地文件包含一般包含一些本地的敏感文件,如:/etc/passwd或/etc/shadow等 远程文件包含能使得服务器代码执行,如包含黑客vps的…...

基于 C# .NET Framework 4.0 开发实现 WCF 服务实例详解(二)——实现Windows服务内嵌WCF服务
目录 引言 1. 创建一个新的Windows服务项目 2. 添加WCF服务 2.1 添加服务接口和实现 2.2 添加服务配置 3. 实现Windows服务 3.1 修改Service1类 3.2 在项目中添加ServiceInstaller 4. 安装和运行Windows服务 4.1 编译项目 4.2 使用InstallUtil.exe安装服务 …...

【ArcGIS/C#】调用控制台处理代码
代码示例 private static string[] run_conda_process(string command, Action<string> on_msg, CancellationTokenSource cancel){if (string.IsNullOrEmpty(command)){return new string[]{null,ArcGIS.Desktop.Internal.Core.Conda.Resources.Error_Unexpected + &qu…...

06_23 种设计模式之《适配器模式》
文章目录 一、适配器模式基础知识实例 一、适配器模式基础知识 适配器模式定义:将一个类的接口转换成客户希望的另一个接 口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可 以一起工作。 Client:客户端,调用自已需要的领域接口…...

Go语言--快速入门
Go语言特点 我们先看一下简单的Go语言程序 package mainimport "fmt"func main() { // 错误,{ 不能在单独的行上fmt.Println("Hello, World!") }我们可以看到外型非常像我们的JAVA,但是不需要;作为结尾,…...

京东云主机怎么用?使用京东云服务器建网站(图文教程)
京东云主机怎么用?非常简单,本文京东云服务器网jdyfwq.com使用以使用京东云服务器搭建WordPress博客网站为例,来详细说下京东云主机的使用方法。使用京东云服务器快速搭建WordPress网站教程,3分钟基于应用镜像一键搞定,…...

Linux 基础入门操作-实验七 进程的介绍
实验七 进程的介绍 7.1 进程基础概念 Linux进程在内存中包含三部分数据:码段、堆栈段和数据段。代码段存放了程序的代码。代码段可以为机器中运行同一程序的数个进程共享。堆栈段存放的是子程序的返回地址、子程序的参数及程序的局部变量。而数据段则存放程序的全…...

SQL进阶技巧:SQL中的正则表达式应用?
目录 0 引言 1. 正则表达式函数 1.1 regexp_extract 1.2 regexp_replace 1.3 regexp_like 2. 在WHERE子句中使用正则表达式 3. 在GROUP BY中使用正则表达式 4. 性能考虑 5. 高级正则表达式技巧 5.1 使用正则表达式进行数据清洗 5.2 使用正则表达式处理JSON 6. 正则…...

算法数组面试理论
数组是存放在连续内存空间内的相同类型数据的集合 (所以在删除添加元素的时候需要移动其他的元素的地址) 数组的元素是不能删除的,只能覆盖。(因为内存地址是连续的,所以不能删除。或者可以这么理解:在一…...

ASP.NET Zero是什么?适合哪些业务场景?
一、ASP.NET Zero是什么? ASP.NET Zero 是一个基于 ASP.NET Boilerplate (ABP) 框架的模板项目,它提供了预建的页面和强大的基础设施架构,以便开发者能够快速开发应用层。它的特点包括但不限于: 多合一解决方案:提供多…...

获取期货股票分钟级别数据以及均线策略
【数据获取】 银河金融数据库(yinhedata.com) 能够获取国内外金融股票、期货历史行情数据,包含各分钟级别。 【搭建策略】 均线策略作为一种广泛应用于股票、期货等市场的技术分析方法,凭借其简单易懂、操作性强等特点…...

入门篇-1 数据结构简介
数据结构简介 在计算机科学中,数据结构是指组织、存储和管理数据的方式,它使得数据可以被高效地访问和修改。数据结构是计算机程序设计和算法分析中的一个重要概念,因为它们直接影响到程序的执行效率和内存使用。 1. 什么是数据结构&#x…...

Anaconda安装
1.进入Anaconda官网 2.填写邮箱信息 3.在邮箱消息中获取下载链接 4.进入下载页面,选择合适版本下载 5.进入Anaconda安装界面 6.点击“I agree” 7.选择个人即可“Just Me” 8.选择文件安装路径 9.允许创建快捷方式 10.等待下载 11.完成安装...

Elasticsearch学习笔记(六)使用集群令牌将新加点加入集群
随着业务的增长,陆续会有新的节点需要加入集群。当我们在集群中的某个节点上使用命令生成令牌时会出现报错信息。 # 生成令牌 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node出现报错信息: Unable to create enrollment…...

项目建设方案,软件技术方案,整体技术方案,软件建设文档编制(word原件)
1 引言 1.1 编写目的 1.2 项目概述 1.3 名词解释 2 项目背景 3 业务分析 3.1 业务需求 3.2 业务需求分析与解决思路 3.3 数据需求分析【可选】 4 项目建设总体规划【可选】 4.1 系统定位【可选】 4.2 系统建设规划 5 建设目标 5.1 总体目标 5.2 分阶段目标【可选】 5.2.1 业务目…...

vue3定义组件
在Vue 3中,定义组件有多种方式,包括使用单文件组件(Single File Components, SFC)、使用JavaScript对象定义组件、以及使用组合式API(Composition API)。 1. 单文件组件(SFC) 这是…...

BOM常见操作方法汇总
BOM(Browser Object Model,浏览器对象模型)提供了与浏览器窗口交互的方法和属性。BOM 包括了许多对象,如 window、location、history、navigator 等,这些对象提供了与浏览器窗口相关的各种功能。 以下是一些常见的 BO…...

Python+whisper/vosk实现语音识别
目录 一、Whisper 1、Whisper介绍 2、安装Whisper 3、使用Whisper-base模型 4、使用Whisper-large-v3-turbo模型 二、vosk 1、Vosk介绍 2、vosk安装 3、使用vosk 三、总结 一、Whisper 1、Whisper介绍 Whisper 是一个由 OpenAI 开发的人工智能语音识别模型…...

如何在算家云搭建LivePortrait(视频生成)
一、LivePortrait简介 LivePortrait 是一个可控人像视频生成框架,能够准确、实时地将驱动视频的表情、姿态迁移到静态或动态人像视频上,生成极具表现力的视频结果。 该项目的模型产生了定性肖像动画。只要输入一张静态的肖像图像,我们的模型…...

CSS 命名规范及 BEM 在前端开发中的实践
一:CSS命名规范的重要性 1、提高代码可读性 对于开发者自身来说,遵循规范的命名可以让你在日后回顾代码时,快速理解每个样式类的用途。例如,使用 “.header-logo” 这样的命名,一眼就能看出是头部的 logo 元素的样式,而不是一些无意义的命名如 “.box1”。当团队协作开发…...

SwiftUI 6.0(iOS 18)新增的网格渐变色 MeshGradient 解惑
概述 在 SwiftUI 中,我们可以借助渐变色(Gradient)来实现更加灵动多彩的着色效果。从 SwiftUI 6.0 开始,苹果增加了全新的网格渐变色让我们对其有了更自由的定制度。 因为 gif 格式图片自身的显示能力有限,所以上面的…...

【计算机网络】详谈TCP协议确认应答机制捎带应答机制超市重传机制连接管理机制流量管理机制滑动窗口拥塞控制延迟应答
一、TCP 协议段格式 1.1、4位首部长度 4位首部长度的基本单位是4字节,也就是说如果4位首部长度填6,那报头长度就是24字节。报头长度的取值范围为[0,60]字节,也就是说选项的最大长度为40字节。 二、确认应答机制 发送数据和发送应答&#x…...