数据分析之Spark框架介绍

news2024/11/25 6:50:20

文章目录

    • 概述
      • 一、发展历程与背景
      • 二、核心特点
      • 三、生态系统与组件
      • 四、应用场景
      • 五、与其他大数据技术的比较
    • 核心概念
      • 1. 弹性分布式数据集(RDD, Resilient Distributed Dataset)
      • 2. 转换(Transformations)和动作(Actions)
      • 3. 累加器(Accumulators)
      • 4. 广播变量(Broadcast Variables)
      • 5. 上下文(SparkContext)
      • 6. 作业(Job)、阶段(Stage)和任务(Task)
      • 7. 部署模式(Deployment Modes)
    • 核心组件
      • 1. SparkContext
      • 2. RDD(弹性分布式数据集)
      • 3. DAGScheduler 和 TaskScheduler
      • 4. Executor 和 Driver
      • 5. Storage Manager
      • 6. Shuffle 和 Sort
      • 7. 累加器(Accumulators)和广播变量(Broadcast Variables)
    • 核心工作流
      • 一、工作流基本步骤
      • 二、高级工作流步骤(根据具体需求可选)
      • 三、工作流优化和调试
      • 四、应用场景
    • 使用样例
      • 1. 批处理:读取文本文件并统计单词频率
      • 2. 流处理:从 Kafka 读取数据并写入 HDFS
      • 3. 机器学习:使用 MLlib 进行线性回归
      • 4. 图处理:使用 GraphX(通过 Java API 的间接方式)
      • 总结

概述

Spark是一种快速、通用、可扩展的大数据分析引擎,它基于内存计算的大数据并行计算框架,能够显著提高大数据环境下数据处理的实时性,同时保证高容错性和高可伸缩性。以下是对Spark的详细介绍:

一、发展历程与背景

  • Spark于2009年诞生于加州大学伯克利分校AMPLab。
  • 2010年,Spark项目开源。
  • 2013年6月,Spark成为Apache孵化项目。
  • 2014年2月,Spark成为Apache顶级项目。

二、核心特点

  1. 高速性能:Spark采用内存计算(In-Memory Computing)的方式,将数据存储在内存中进行处理,从而大幅提升了数据处理速度。相比于传统的磁盘存储方式,Spark能够在内存中进行更快的数据访问和计算。
  2. 可扩展性:Spark具有良好的可扩展性,可以在大规模分布式集群上运行。它通过将任务分发到集群中的多个节点并行执行,充分利用集群中的计算和存储资源,实现高效的分布式计算。
  3. 容错性:Spark具备容错性,即使在集群中发生节点故障或任务失败时,它能够自动恢复和重新执行。Spark通过记录数据操作的转换历史和依赖关系,可以在发生故障时重新计算丢失的数据,确保计算结果的正确性和可靠性。
  4. 多种数据处理任务支持:Spark支持多种数据处理任务,包括批处理、交互式查询、流式处理和机器学习等。它提供了丰富的API和库,用于处理不同类型的数据和应用场景。
  5. 多语言支持:Spark支持多种编程语言,如Scala、Java、Python和R等。开发人员可以使用自己熟悉的编程语言来编写Spark应用程序,方便快捷地进行大数据处理和分析。

三、生态系统与组件

Spark生态系统已经发展成为一个包含多个子项目的集合,这些子项目包括:
请添加图片描述

  1. Spark Core:实现了Spark的基本功能,包含RDD(弹性分布式数据集)、任务调度、内存管理、错误恢复、与存储系统交互等模块。
  2. Spark SQL:Spark用来操作结构化数据的程序包,允许开发人员使用SQL查询数据。
  3. Spark Streaming:Spark提供的对实时数据进行流式计算的组件,可以处理来自多种数据源的数据流,并将结果保存到外部文件系统、数据库或应用到实时仪表盘。
  4. Spark MLlib:提供常见的机器学习(ML)功能的程序库,包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据导入等额外的支持功能。
  5. GraphX:Spark中用于图计算的API,性能良好,拥有丰富的功能和运算符,能在海量数据上自如地运行复杂的图算法。

四、应用场景

Spark的应用场景非常广泛,包括但不限于以下几个方面:

  1. 批处理:Spark可以处理大规模的数据集,并提供了丰富的数据处理和转换功能,适用于各种批处理任务,如数据清洗、ETL、数据分析等。
  2. 实时流处理:Spark的流处理模块Spark Streaming可以实时处理数据流,并提供了低延迟的处理能力,适用于实时推荐、实时分析、日志处理等应用场景。
  3. 机器学习:Spark的MLlib库提供了各种常用的机器学习算法和工具,可以在大规模数据上进行机器学习任务,如分类、回归、聚类、推荐等。
  4. 图计算:Spark的GraphX库可以处理大规模图结构数据,并提供了各种图算法和操作,适用于社交网络分析、网络图谱等应用。

五、与其他大数据技术的比较

与Hadoop相比,Spark具有显著的优势。Hadoop的MapReduce引擎在处理大规模数据集时,需要将中间结果写入磁盘,这导致了较高的磁盘I/O开销和较低的处理速度。而Spark基于内存计算,能够减少磁盘I/O操作,显著提高数据处理速度。此外,Spark还支持多种编程语言、具有丰富的生态系统和组件,能够更好地满足大数据处理和分析的需求。

核心概念

Spark作为一个强大且灵活的大数据分析引擎,其核心概念对于理解和使用Spark至关重要。以下是对Spark核心概念的详细介绍:

1. 弹性分布式数据集(RDD, Resilient Distributed Dataset)

请添加图片描述

RDD是Spark中最基本的数据处理模型,它是一个不可变的、分布式的对象集合。RDD允许用户并行地操作大型数据集,这些操作可以自动地在集群的多个节点上并行执行。RDD通过记录数据的转换历史(即Lineage)来实现容错,当某个节点上的数据丢失时,Spark可以根据Lineage重新计算该数据。

2. 转换(Transformations)和动作(Actions)

请添加图片描述

在Spark中,对RDD的操作可以分为两类:转换(Transformations)和动作(Actions)。

  • 转换:创建新的RDD的操作,例如mapfilterreduceByKey等。这些操作是懒执行的,即它们不会立即执行,而是会创建一个新的RDD,这个RDD记录了原始RDD和要执行的转换操作。
  • 动作:触发Spark作业执行的操作,例如collectcountsaveAsTextFile等。这些操作会返回结果给驱动程序或将数据写入外部存储系统,并触发Spark任务的执行。

3. 累加器(Accumulators)

累加器是一种只能进行“加”操作的变量,它可以用于实现计数器和求和等操作。Spark中的累加器是线程安全的,并且只支持在驱动程序中修改(通过add方法)。累加器通常用于并行计算中的全局聚合操作。

4. 广播变量(Broadcast Variables)

广播变量用于将大型只读数据集分发到集群中的所有节点。与将变量复制到每个工作节点的方式相比,广播变量使用更高效的网络传输机制,可以显著减少数据复制的开销。广播变量在需要跨多个任务或节点共享大型只读数据集时非常有用。

5. 上下文(SparkContext)

SparkContext是Spark的主要入口点,它代表了与Spark集群的连接。在编写Spark应用程序时,首先需要创建一个SparkContext对象,然后通过该对象来创建RDD、累加器、广播变量等。

6. 作业(Job)、阶段(Stage)和任务(Task)

  • 作业:由动作操作触发的一系列计算任务。一个作业可能包含多个阶段。
  • 阶段:根据RDD之间的依赖关系(即宽依赖和窄依赖),Spark将作业划分为多个阶段。每个阶段包含一组可以并行执行的任务。
  • 任务:Spark中最小的执行单元。每个任务通常对应于一个RDD的分区上的计算操作。

7. 部署模式(Deployment Modes)

Spark支持多种部署模式,包括:

  • 本地模式:在单个JVM中运行Spark应用程序,适用于开发和测试。
    请添加图片描述

  • 独立集群模式:使用Spark自带的集群管理器来管理资源。
    请添加图片描述

  • YARN模式:将Spark应用程序作为YARN应用程序运行,使用YARN作为资源管理器。

  • yarn模式部署

  • Mesos模式:将Spark应用程序作为Mesos框架运行,使用Mesos作为资源管理器。
    mesos部署模式

这些核心概念共同构成了Spark的基础架构和数据处理模型,使得Spark能够高效地处理大规模数据集,并支持多种数据处理和分析任务。

核心组件

Spark核心组件构成了其强大且灵活的大数据处理和分析能力的基础。以下是Spark的核心组件及其简要介绍:

1. SparkContext

SparkContext是Spark应用程序的入口点,它负责与Spark集群进行交互。通过SparkContext,用户可以创建RDD、累加器、广播变量等,并提交作业到集群上执行。SparkContext还管理着与集群的连接、资源的分配和释放等。

2. RDD(弹性分布式数据集)

RDD是Spark中最基本的数据处理模型,它是一个不可变的、分布式的对象集合。RDD允许用户以并行和容错的方式操作大型数据集。RDD的操作分为转换(Transformations)和动作(Actions),转换操作会创建新的RDD,而动作操作会触发Spark作业的执行并返回结果。

3. DAGScheduler 和 TaskScheduler

DAGScheduler(有向无环图调度器)和TaskScheduler(任务调度器)共同负责Spark作业的调度和执行。DAGScheduler将作业划分为多个阶段,并根据RDD之间的依赖关系构建有向无环图(DAG)。然后,它将每个阶段的任务提交给TaskScheduler进行调度和执行。TaskScheduler负责将任务分配给集群中的工作节点,并监控任务的执行状态。

4. Executor 和 Driver

在Spark集群中,Executor是工作节点上的进程,负责执行Spark任务。每个Executor都管理着一组内存和CPU资源,并可以与Driver进行通信。Driver是运行用户Spark应用程序的进程,它负责创建SparkContext、提交作业、与集群管理器进行交互等。Driver还负责监控作业的执行状态,并在必要时重新执行失败的任务。

5. Storage Manager

Storage Manager是Spark中的存储管理组件,它负责管理RDD的持久化(即缓存)和存储。当RDD被持久化时,Storage Manager会将其数据存储在内存或磁盘上,以便在后续的任务中重用。Storage Manager还负责监控内存使用情况,并在必要时进行垃圾回收和内存清理。

6. Shuffle 和 Sort

Shuffle是Spark中用于重新分布数据的一种机制,它通常发生在宽依赖(如reduceByKey)操作中。Shuffle过程包括数据的拆分、传输和合并等步骤,以确保数据能够在集群中正确地重新分布。Sort操作则是对数据进行排序的过程,它通常与Shuffle一起使用,以优化数据处理的性能。

7. 累加器(Accumulators)和广播变量(Broadcast Variables)

累加器和广播变量是Spark中用于优化数据处理的两种特殊变量。累加器允许用户以线程安全的方式在集群中累加数据,而广播变量则用于将大型只读数据集分发到集群中的所有节点上,以减少数据复制的开销。

这些核心组件共同协作,使得Spark能够高效地处理大规模数据集,并支持多种数据处理和分析任务。通过深入理解这些组件的工作原理和交互方式,用户可以更好地利用Spark进行大数据处理和分析。

核心工作流

Apache Spark工作流是一个用于大规模数据处理和分析的完整流程,涵盖了从数据读取、转换、计算到结果保存和可视化的各个方面。以下是对Apache Spark工作流的详细介绍:
spark-arc

一、工作流基本步骤

  1. 创建SparkSession

    • SparkSession是Spark 2.0引入的,作为Spark应用程序的入口点,它为用户提供了一个统一的API来创建DataFrame、注册DataFrame为表、执行SQL查询等。
    • 创建SparkSession通常涉及设置Spark应用程序的名称、配置Spark集群的参数等。
  2. 读取数据

    • 使用SparkSession的read方法从各种数据源读取数据,如HDFS、S3、本地文件系统等。
    • 支持多种数据格式,如CSV、JSON、Parquet、Avro等。
    • 读取的数据可以被加载为DataFrame或RDD(弹性分布式数据集)等数据结构。
  3. 数据转换

    • 使用DataFrame API或RDD API对数据进行转换操作,如筛选、分组、聚合、映射、过滤等。
    • 转换操作是惰性的,即它们不会立即执行,而是会构建一个逻辑执行计划,直到执行动作时才触发实际的计算。
  4. 执行动作

    • 动作操作会触发Spark执行引擎进行计算,并返回结果。
    • 常见的动作操作包括count(计数)、collect(收集到驱动程序)、show(显示前几行数据)等。
  5. 获取结果

    • 执行动作后,可以从Spark应用程序中获取计算结果。
    • 结果可以是RDD、DataFrame或其他数据结构,具体取决于执行的动作和转换操作。

二、高级工作流步骤(根据具体需求可选)

  1. 数据清洗和预处理

    • 对读取的数据进行清洗和预处理,如处理缺失值、异常值、重复值等。
    • 可以使用Spark的转换操作来实现数据清洗和预处理。
  2. 数据探索

    • 对数据进行探索性分析,了解数据的特征、分布和相关性。
    • 可以使用Spark SQL或DataFrame API来执行SQL查询或数据统计分析。
  3. 模型训练和评估

    • 使用Spark的MLlib(机器学习库)来训练机器学习模型,如分类、回归、聚类等。
    • 在训练完成后,对模型进行评估,并根据评估结果调整模型参数和特征选择。
  4. 结果保存和可视化

    • 将分析结果保存到存储系统中,如数据库、文件系统或其他数据仓库。
    • 使用可视化工具(如Apache Zeppelin、Jupyter Notebook等)对分析结果进行可视化展示。

三、工作流优化和调试

  1. 性能优化

    • 根据数据规模和计算需求,合理配置Spark集群的参数和资源。
    • 使用Spark的缓存机制来加速数据访问。
    • 优化数据转换和操作逻辑,减少不必要的数据移动和计算。
  2. 故障调试

    • 使用Spark的日志和监控工具来跟踪和分析应用程序的执行情况。
    • 根据日志信息定位和解决故障问题。
    • 合理使用Spark的容错机制来确保应用程序的稳定性和可靠性。

四、应用场景

Apache Spark工作流广泛应用于各种大数据处理和分析场景,如数据仓库、实时流处理、交互式数据分析、机器学习和人工智能等。具体应用场景包括但不限于:

  • 数据清洗和ETL(Extract-Transform-Load)
  • 批处理历史数据
  • 实时流处理(如社交媒体监控、传感器数据收集等)
  • 交互式数据分析和商业智能
  • 机器学习和人工智能应用开发(如推荐系统、预测模型等)

使用样例

当然,下面我将提供几个使用 Java 编写 Apache Spark 代码的样例,涵盖不同的应用场景。请注意,为了运行这些代码,你需要确保已经配置好了 Spark 环境,并且你的项目中包含了 Spark 的依赖。

1. 批处理:读取文本文件并统计单词频率

场景描述:读取一个文本文件,计算每个单词出现的频率,并将结果输出。

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import scala.Tuple2;

import java.util.Arrays;

public class WordCount {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf().setAppName("WordCount").setMaster("local");
        JavaSparkContext sc = new JavaSparkContext(conf);

        JavaRDD<String> lines = sc.textFile("path/to/your/textfile.txt");
        JavaRDD<String> words = lines.flatMap(line -> Arrays.asList(line.split(" ")).iterator());
        JavaPairRDD<String, Integer> wordCounts = words.mapToPair(word -> new Tuple2<>(word, 1))
                .reduceByKey((a, b) -> a + b);

        wordCounts.collect().forEach(tuple -> System.out.println(tuple._1() + ": " + tuple._2()));

        sc.close();
    }
}

2. 流处理:从 Kafka 读取数据并写入 HDFS

场景描述:从 Kafka 主题中读取实时数据流,进行一些处理(如转换格式),然后将结果写入 HDFS。

(注意:这个示例需要额外的 Kafka 和 HDFS 配置,并且 KafkaUtils 不是一个标准的 Spark 类,而是需要额外的依赖,如 spark-streaming-kafka-0-10。)

// 省略了导入语句,因为它们取决于你使用的 Spark 和 Kafka 版本
public class KafkaToHDFS {
    public static void main(String[] args) throws InterruptedException {
        SparkConf conf = new SparkConf().setAppName("KafkaToHDFS").setMaster("local[*]");
        StreamingContext ssc = new StreamingContext(conf, Durations.seconds(10));

        // Kafka 参数
        Map<String, Object> kafkaParams = new HashMap<>();
        kafkaParams.put("bootstrap.servers", "localhost:9092");
        kafkaParams.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        kafkaParams.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        kafkaParams.put("group.id", "spark-streaming-group");
        kafkaParams.put("auto.offset.reset", "latest");
        kafkaParams.put("enable.auto.commit", false);

        // 创建 KafkaDStream
        Collection<String> topics = Arrays.asList("your_kafka_topic");
        DStream<String> kafkaStream = ssc.kafkaStream(kafkaParams, topics);

        // 处理数据
        DStream<String> processedStream = kafkaStream.map(record -> {
            // 假设 Kafka 记录是简单的字符串,你可以在这里进行转换或处理
            return record.value();
        });

        // 将结果写入 HDFS
        processedStream.saveAsTextFiles("hdfs://path/to/output_directory/" + System.currentTimeMillis(), "txt");

        // 启动流处理
        ssc.start();
        ssc.awaitTermination();
    }
}

注意:上面的 Kafka 示例代码为了简洁而省略了一些细节,如依赖和完整的导入语句。你需要根据你的 Spark 和 Kafka 版本添加适当的依赖,并导入必要的类。

3. 机器学习:使用 MLlib 进行线性回归

场景描述:使用 Spark MLlib 加载数据集,训练一个线性回归模型,并进行预测。

// 省略了导入语句

public class LinearRegressionExample {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf().setAppName("LinearRegressionExample").setMaster("local");
        SparkSession spark = SparkSession.builder().config(conf).getOrCreate();

        // 加载数据集(这里假设是一个 CSV 文件)
        Dataset<Row> data = spark.read().format("csv").option("header", "true").option("inferSchema", "true").load("path/to/your/data.csv");

        // 准备数据
        VectorAssembler assembler = new VectorAssembler().setInputCols(new String[]{"feature1", "feature2", ...}) // 根据你的数据集替换特征列
                .setOutputCol("features");
        Dataset<Row> assembledData = assembler.transform(data).select("features", "label");

        // 划分训练集和测试集
        Dataset<Row>[] splits = assembledData.randomSplit(new double[]{0.7, 0.3});
        Dataset<Row> trainingData = splits[0];
        Dataset<Row> testData = splits[1];

        // 训练线性回归模型
        LinearRegression lr = new LinearRegression().setLabelCol("label").setFeaturesCol("features");
        LinearRegressionModel lrModel = lr.fit(trainingData);

        // 进行预测
        Dataset<Row> predictions = lrModel.transform(testData);

        // 显示结果
        predictions.show();

        // 停止 SparkSession
        spark.stop();
    }
}

注意:上面的 MLlib 示例也省略了一些细节,如数据集的具体格式和特征列的名称。你需要根据你的数据集进行相应的调整。

4. 图处理:使用 GraphX(通过 Java API 的间接方式)

场景描述:虽然 GraphX 是基于 Scala 的,但你可以通过 Java 调用 Scala 代码或使用 GraphFrames(基于 DataFrame 的图处理库)来进行图处理。下面是一个使用 GraphFrames 的简单示例。

(注意:GraphFrames 需要额外的依赖,并且它的 API 是基于 DataFrame 的。)

// 省略了导入语句和详细的设置代码

public class GraphFramesExample {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf().setAppName("GraphFramesExample").setMaster("local");
        SparkSession spark = SparkSession.builder().config(conf).getOrCreate();

        // 加载顶点数据
        Dataset<Row> vertices = spark.read().format("csv").option("header", "true").option("inferSchema", "true").load("path/to/vertices.csv");

        // 加载边数据
        Dataset<Row> edges = spark.read().format("csv").option("header", "true").option("inferSchema", "true").load("path/to/edges.csv");

        // 创建图
        GraphFrame graph = GraphFrame.create(vertices, edges);

        // 计算 PageRank
        Dataset<Row> pageRankResult = graph.pageRank().run(10); // 10 是迭代次数

        // 显示结果
        pageRankResult.show();

        // 停止 SparkSession
        spark.stop();
    }
}

注意:GraphFrames 需要额外的依赖,并且它的 API 与 GraphX 不同。上面的示例代码为了简洁而省略了一些细节,如数据集的格式和依赖的添加。

由于 Java API 的限制和 GraphX 的 Scala 特性,使用 Java 进行图处理时可能需要更多的工作。如果可能的话,考虑使用 Scala 或 Python(通过 PySpark)来更直接地利用 GraphX 的功能。

总结

上面的示例代码展示了如何使用 Java 编写 Spark 应用程序来处理不同类型的数据和任务。然而,由于 Spark 的广泛功能和 Java 语言的限制,有些任务(如图处理)可能需要额外的库或更复杂的设置。在实际应用中,你可能需要根据你的具体需求和可用资源来调整这些示例代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2194706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python jpg 简单研究 1

起因&#xff0c; 目的: 就是想看看 jpg 里面有什么。 其实&#xff0c;我最开始的想法是&#xff0c;自己来写一个文件格式&#xff0c;只能我自己才能打开。 然后看了 jpg 相关的内容&#xff0c;发现太复杂&#xff0c;只能罢了。 1. jpg 的魔法头数字&#xff08;File Ma…

蝶形激光器驱动(温控精度0.002°C 激光电流分辨率5uA)

蝶形半导体激光器驱动电流的稳定性直接决定了其输出波长的稳定性,进而影响检测精度.为了满足气体浓度检测中对激光器输出波长稳定可调的要求,设计了数字与模拟电路混合的恒流驱动电路.STM32为主控芯片数控模块完成扫描AD/DA转换;模拟电路主要由负反馈运算放大、高精度CMOS管和反…

《向量数据库指南》揭秘:Mlivus Cloud如何借Fivetran Partner SDK实现数据飞跃

哈哈,各位向量数据库领域的同仁们,今天咱们来聊聊 Fivetran 的 Partner SDK 如何助力技术供应商构建自定义连接器和目标,特别是与 Mlivus Cloud 的集成,这可是个热门话题啊! Fivetran 的 Partner SDK,简直就是为技术供应商量身打造的“神器”。有了它,你就可以轻松地为…

LeetCode讲解篇之300. 最长递增子序列

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 这题我们可以通过动态规划求解&#xff0c;使用一个数组f&#xff0c;数组f的i号元素表示[0, i]范围内最长递增子序列的长度 状态转移方程&#xff1a;f[i] max(f[j] 1)&#xff0c;其中 0 < j < i 题…

node高版本报错: digital envelope routines::unsupported

node高版本报错&#xff1a; digital envelope routines::unsupported 解决方案&#xff1a; package.json中&#xff0c;启动命令前加上&#xff1a; set NODE_OPTIONS--openssl-legacy-provider &&

Windows安装Linux子系统报错:WslRegisterDistribution failed with error: 0x8007019e

WslRegisterDistribution failed with error: 0x8007019e 报错截图如下图&#xff1a; 该处是由于没有安装Linux内核&#xff0c;因此需要安装。可前往官网查看详情&#xff1a;https://aka.ms/wslinstall 需要解决该问题&#xff0c;可参照官网方法&#xff08;我没试过官网…

pip丢了怎么办!不用怕,教你用get-pip.py来下载

1.下载get-pip.py进行安装 我们有的时候环境中会找不到或者误删丢失了pip模块&#xff0c;就没办法安装新的python模组&#xff0c;那怎么办呢&#xff0c;官方提供了get-pip.py模块可以帮我们快速安装pip。 get-pip.py网站 bootstrap.pypa.io/get-pip.py 直接将文件下载下来…

已解决:AttributeError: ‘str‘ object has no attribute ‘decode‘

已解决&#xff1a;AttributeError: ‘str’ object has no attribute ‘decode’ 文章目录 写在前面问题描述报错原因分析 解决思路解决办法1. 确保只对 bytes 对象调用 decode()2. 将 Python 2 的旧代码迁移到 Python 33. 检查数据来源4. 处理编码不一致的问题5. 使用 six 库…

Java第二阶段---11封装---第四节 static 修饰符

1.static 修饰符应用范围 static修饰符只能用来修饰类中定义的成员变量、成员方法、代码块以及内部类(内部类有专门章节进行讲解)。 2.static 修饰成员变量 static 修饰的成员变量称之为类变量。属于该类所有成员共享。 示例 package cn.lyxq.test04;public class Chinese…

系统架构设计师论文《论企业应用系统的分层架构风格》精选试读

论文真题 软件架构风格是描述一类特定应用领域中系统组织方式的惯用模式&#xff0c;反映了领域中诸多系统所共有的结构特征和语义特征&#xff0c;并指导如何将各个模块和子系统有效组织成一个完整的系统。分层架构是一种常见的软件架构风格&#xff0c;能够有效简化设计&…

HDLBits中文版,标准参考答案 | 3.1.3 Arithmetic Circuits | 算术电路

关注 望森FPGA 查看更多FPGA资讯 这是望森的第 10 期分享 作者 | 望森 来源 | 望森FPGA 目录 1 Half adder | 半加器 2 Full adder | 全加器 3 3-bit binary adder | 3位二进制加法器 4 Adder | 加法器 5 Signed addition overflow | 有符号数的加法溢出 6 100-bit bi…

【JavaEE初阶】深入理解线程池的概念以及Java标准库提供的方法参数分析

前言 &#x1f31f;&#x1f31f;本期讲解关于MySQL索引事务&#xff0c;希望能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;【JavaEE初阶】多线程案列之定时器的使用和内部原码模拟-CSDN博客 &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl…

ScholarAI发一个月会员啦!

诸神缄默不语-个人CSDN博文目录 ScholarAI是一个用于学术的工具&#xff0c;用LLM智能检索用户所需的论文&#xff0c;可以进行简单的总结和分析。可以理解成“LLM帮你读论文”这种感觉。 这次之所以发会员是因为GPT Store服务出问题了&#xff0c;所以给了用户一个月会员作为…

双向数据库迁移工具:轻松实现 MySQL 与 SQLite 数据互导

项目概述与作用 该项目的核心是实现 MySQL 和 SQLite 两种数据库之间的数据迁移工具。它能够轻松地将 MySQL 数据库中的数据导出为 SQLite 数据库文件&#xff0c;反过来也可以将 SQLite 数据库中的数据上传到 MySQL 数据库中。这个双向迁移工具非常适用于&#xff1a; 数据库备…

【C++】--类和对象(2)

&#x1f44c;个人主页: 起名字真南 &#x1f446;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 类的默认成员函数2 构造函数3 析构函数4 拷贝构造5 赋值运算符重载5.1 运算符重载5.2 赋值运算符的重载 1 类的默认成员函数 默认成员函数就是用户没有显示实现&#xff0c;…

制作U盘启动盘1 — UltraISO

官网&#xff1a;UltraISO软碟通中文官方网站 - 光盘映像文件制作/编辑/转换工具 点击工具栏的“打开”&#xff0c;在弹出的窗口选择要刻录的ISO文件。 点击菜单栏的“启动”—“写入磁盘映像”。 硬盘驱动器选择要刻录的U盘。 点击写入&#xff0c;会弹出数据丢失的提示&…

数据结构和算法简介

目录 1.认识数据结构 什么是数据结构 逻辑结构 物理结构 常见的数据结构 2.认识算法 什么是算法 如何衡量算法效率 时间复杂度 什么是时间复杂度 如何计算时间复杂度 大O渐进表示法 常见时间复杂度计算例子 空间复杂度 什么是空间复杂度 如何计算空间复杂度 常…

【数据结构】深度解析堆排序

目录 &#x1f4af;引言 &#x1f4af;堆的概念 &#xff08;一&#xff09;什么是堆 &#xff08;二&#xff09;堆的表示 &#x1f4af;堆排序原理 &#xff08;一&#xff09;建堆 &#xff08;二&#xff09;排序 &#x1f4af;代码实现 &#x1f4af;代码分析 &…

【Sqlite】sqlite内部函数sqlite3_value_text特性

目录 ⚛️1 结论 ☪️2 说明 ☪️3 传入数值转成科学计数法 ♋3.1 只有整数部分 ♏3.2 只有小数部分 ♐3.3 整数小数 ⚛️1 结论 整数(sqlite视为int64)位数 > 20位&#xff0c;sqlite3_value_text 采用科学计数法。否则正常表示。 浮点数(sqlite视为double)的整数部…

STM32 通用同步/异步通信

一、串行通信简介 CPU与外围设备之间的信息交换称为通信。基本的通信方式有并行通信和串行通信两种。STM32单片机提供了功能强大的串行通信模块&#xff0c;即通用同步/异步收发器&#xff08;USART&#xff09;。 1.串行通信 串行通信是数据字节一位一位地依次传送的通信方式。…