如何学习Spark:糙快猛的大数据之旅

在这里插入图片描述

作为一名大数据开发者,我深知学习Spark的重要性。今天,我想和大家分享一下我的Spark学习心得,希望能够帮助到正在学习或准备学习Spark的朋友们。

目录

    • Spark是什么?
    • 学习Spark的"糙快猛"之道
      • 1. 不要追求完美,在实践中学习
      • 2. 利用大模型作为24小时助教
      • 3. 根据自己的节奏来
      • 4. 实战项目是最好的老师
    • 深入Spark:进阶学习策略
      • 1. 理解Spark的核心概念
      • 2. 拥抱Spark生态系统
      • 3. 实战驱动学习
      • 4. 性能调优:磨刀不误砍柴工
      • 5. 保持学习的激情
    • Spark高级应用:从入门到精通
      • 1. 机器学习与Spark MLlib
      • 2. 图计算与GraphX
      • 3. 性能调优进阶
      • 4. 实战案例:日志分析系统
      • 5. 保持学习和探索的态度
    • Spark在企业级应用中的实战经验
      • 1. 数据湖构建与管理
      • 2. 实时数据处理与分析
      • 3. 大规模机器学习
      • 4. 性能调优的艺术
      • 5. 与其他大数据技术的集成
    • 结语:持续学习,不断突破

Spark是什么?

image.png

首先,让我们简单了解一下Spark。Apache Spark是一个快速、通用的分布式计算系统,专为大规模数据处理而设计。它提供了高级API,支持Java、Scala、Python和R等多种编程语言,能够运行各种工作负载,包括批处理、流处理、机器学习和交互式查询等。
image.png

学习Spark的"糙快猛"之道

说到学习Spark,我想分享一个我的亲身经历。秘诀是什么?就是"糙快猛"!
image.png

1. 不要追求完美,在实践中学习

学习Spark时,不要一开始就追求完美。先快速上手,了解基本概念和操作,然后在实践中不断深化理解。比如,你可以先学习如何创建一个简单的SparkSession:

from pyspark.sql import SparkSession

spark = SparkSession.builder \
    .appName("MyFirstSparkApp") \
    .getOrCreate()

# 读取一个CSV文件
df = spark.read.csv("path/to/your/file.csv", header=True, inferSchema=True)

# 显示数据的前几行
df.show()

# 关闭SparkSession
spark.stop()

这个简单的例子让你快速体验了Spark的基本操作。记住,不完美没关系,重要的是你迈出了第一步!

2. 利用大模型作为24小时助教

image.png

现在我们有了大模型作为24小时助教,学习效率可以大大提高。遇到问题时,可以随时向大模型提问,获取解答和建议。但要注意,大模型虽然能帮上不少忙,但还远没到能完全代劳的地步。建立自己的审美和判断力仍然很重要。

3. 根据自己的节奏来

每个人的学习节奏不同,不要盲目跟风。有人可能一周就能掌握Spark的基础,有人可能需要一个月。找到适合自己的节奏,稳步前进才是王道。
image.png

4. 实战项目是最好的老师

理论学习固然重要,但实战项目才是真正提升技能的关键。试着用Spark解决一些实际问题,比如分析一个大型数据集:
image.png

# 假设我们有一个大型的销售数据集
sales_df = spark.read.parquet("path/to/sales_data.parquet")

# 按地区和产品类别统计销售额
result = sales_df.groupBy("region", "product_category") \
    .agg({"sales_amount": "sum"}) \
    "sales_amount": "sum"}) \
    .orderBy("region", "sum(sales_amount).desc")

# 显示结果
result.show()

通过这样的实战项目,你不仅能学习Spark的API使用,还能了解如何处理大规模数据集和优化查询性能。

深入Spark:进阶学习策略

image.png

在掌握了Spark的基础知识后,让我们来谈谈如何更深入地学习Spark,真正成为一名Spark专家。

1. 理解Spark的核心概念

要真正掌握Spark,你需要深入理解一些核心概念,比如RDD(弹性分布式数据集)、DataFrame、Dataset等。这些是Spark的基石,也是你能够高效使用Spark的关键。
image.png

举个例子,让我们看看如何使用RDD进行单词计数:

# 创建一个包含文本行的RDD
lines = spark.sparkContext.textFile("path/to/your/text/file.txt")

# 将每行拆分成单词,然后进行计数
word_counts = lines.flatMap(lambda line: line.split(" ")) \
                   .map(lambda word: (word, 1)) \
                   .reduceByKey(lambda a, b: a + b)

# 显示结果
for word, count in word_counts.collect():
    print(f"{word}: {count}")

这个例子展示了Spark的函数式编程模型,以及如何使用转换(transformation)和动作(action)操作来处理数据。

2. 拥抱Spark生态系统

Spark不仅仅是一个计算引擎,它还有一个丰富的生态系统。Spark SQL、Spark Streaming、MLlib (机器学习库)和GraphX (图计算库)都是Spark生态系统的重要组成部分。不要被这些吓到,记住我们的"糙快猛"原则,逐个攻克!

image.png

比如,你可以尝试使用Spark SQL来处理结构化数据:

# 从JSON文件创建一个DataFrame
df = spark.read.json("path/to/your/data.json")

# 注册为临时视图
df.createOrReplaceTempView("my_data")

# 使用SQL查询
result = spark.sql("""
    SELECT category, AVG(price) as avg_price
    FROM my_data
    GROUP BY category
    HAVING AVG(price) > 100
""")

result.show()

3. 实战驱动学习

记住,光看不练是不行的。找一些开源的大数据项目,看看别人是如何使用Spark的。更好的是,自己动手做一个项目。比如,你可以尝试使用Spark Streaming处理实时数据:
image.png

from pyspark.sql.functions import *

# 创建一个流式DataFrame,监听9999端口的数据
lines = spark.readStream.format("socket") \
    .option("host", "localhost").option("port", 9999).load()

# 简单的单词计数
word_counts = lines.select(explode(split(lines.value, " ")).alias("word")) \
    .groupBy("word").count()

# 启动流式查询
query = word_counts.writeStream.outputMode("complete") \
    .format("console").start()

query.awaitTermination()

这个例子展示了如何使用Spark Streaming处理实时数据流。你可以用nc -lk 9999命令在终端启动一个数据源,然后输入文本,看看Spark是如何实时处理数据的。

4. 性能调优:磨刀不误砍柴工

image.png

当你的Spark应用运行在大规模数据集上时,性能调优就变得至关重要。这包括数据倾斜处理、内存管理、任务调度等方面。虽然这些听起来很高深,但别忘了我们的"糙快猛"精神 —— 先上手,在实践中慢慢优化。

一个简单的优化例子:

# 使用缓存加速重复计算
popular_products = df.groupBy("product_id").count().filter("count > 1000")
popular_products.cache()

# 使用广播变量优化join操作
from pyspark.sql.functions import broadcast

small_df = spark.table("small_but_important_table")
result = big_df.join(broadcast(small_df), "join_key")

5. 保持学习的激情

image.png

大数据技术发展很快,Spark也在不断更新。保持学习的激情,关注Spark的最新发展,参与社区讨论,这些都是提升自己的好方法。记住,当你遇到困难时,想想当初是如何"叉会腰"的,保持这种自信和热情!

Spark高级应用:从入门到精通

现在我们已经掌握了Spark的基础知识,是时候深入一些更高级的应用场景了。记住我们的"糙快猛"原则 —— 不要害怕尝试,在实践中学习和成长。

1. 机器学习与Spark MLlib

image.png

Spark的MLlib库提供了丰富的机器学习算法。作为一个从零开始学习算法的人,我深知掌握这些工具的重要性。让我们看一个使用MLlib进行线性回归的例子:

from pyspark.ml.regression import LinearRegression
from pyspark.ml.feature import VectorAssembler

# 准备数据
data = spark.read.csv("path/to/your/data.csv", header=True, inferSchema=True)
assembler = VectorAssembler(inputCols=["feature1", "feature2", "feature3"], outputCol="features")
data = assembler.transform(data)

# 划分训练集和测试集
(trainingData, testData) = data.randomSplit([0.7, 0.3])

# 创建和训练模型
lr = LinearRegression(featuresCol="features", labelCol="label")
model = lr.fit(trainingData)

# 在测试集上评估模型
predictions = model.transform(testData)
predictions.select("prediction", "label", "features").show(5)

# 打印模型系数和截距
print("Coefficients: " + str(model.coefficients))
print("Intercept: " + str(model.intercept))

这个例子展示了如何使用Spark MLlib进行简单的线性回归。记住,"糙快猛"不意味着不求甚解。在实践的过程中,深入理解这些算法的原理和适用场景同样重要。

2. 图计算与GraphX

对于复杂的关系数据,Spark的GraphX模块提供了强大的图计算能力。例如,我们可以用它来分析社交网络:
image.png

from pyspark.sql import SparkSession
from graphframes import GraphFrame

# 创建顶点DataFrame
v = spark.createDataFrame([
  ("a", "Alice", 34),
  ("b", "Bob", 36),
  ("c", "Charlie", 30),
], ["id", "name", "age"])

# 创建边DataFrame
e = spark.createDataFrame([
  ("a", "b", "friend"),
  ("b", "c", "follow"),
  ("c", "b", "follow"),
], ["src", "dst", "relationship"])

# 创建图
g = GraphFrame(v, e)

# 查找入度最高的用户
result = g.inDegrees.orderBy("inDegree", ascending=False)
result.show()

# 运行PageRank算法
ranks = g.pageRank(resetProbability=0.15, tol=0.01)
ranks.vertices.select("id", "pagerank").show()

这个例子展示了如何使用GraphX构建一个简单的社交网络图,并进行基本的图分析。

3. 性能调优进阶

image.png

在实际工作中,你可能会遇到各种性能问题。以下是一些进阶的性能调优技巧:

  1. 数据倾斜处理:
from pyspark.sql.functions import spark_partition_id

# 识别数据倾斜
df.groupBy(spark_partition_id()).count().show()

# 处理数据倾斜 - 加盐法
from pyspark.sql.functions import rand
df_skewed = df.withColumn("salt", (rand()*10).cast("int"))
df_normal = df_normal.withColumn("salt", lit(-1))

result = df_skewed.join(broadcast(df_normal), 
                        (df_skewed.key == df_normal.key) & 
                        ((df_skewed.salt == df_normal.salt) | (df_normal.salt == -1)))
  1. 内存管理:
# 设置Spark配置以优化内存使用
spark.conf.set("spark.memory.fraction", 0.8)
spark.conf.set("spark.memory.storageFraction", 0.3)

# 使用堆外内存
spark.conf.set("spark.memory.offHeap.enabled", "true")
spark.conf.set("spark.memory.offHeap.size", "2g")

4. 实战案例:日志分析系统

image.png

让我们把学到的知识综合起来,实现一个简单的日志分析系统:

from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.sql.types import *

# 创建SparkSession
spark = SparkSession.builder.appName("LogAnalysis").getOrCreate()

# 定义日志格式
log_format = StructType([
    StructField("ip", StringType(), True),
    StructField("timestamp", TimestampType(), True),
    StructField("method", StringType(), True),
    StructField("url", StringType(), True),
    StructField("status", IntegerType(), True),
    StructField("size", IntegerType(), True)
])

# 读取日志文件
logs = spark.readStream.format("csv") \
    .schema(log_format) \
    .option("sep", " ") \
    .load("/path/to/log/directory")

# 分析日志
analyzed_logs = logs.withWatermark("timestamp", "1 hour") \
    .groupBy(window("timestamp", "5 minutes"), "status") \
    .agg(count("*").alias("count"))

# 输出结果
query = analyzed_logs.writeStream \
    .outputMode("complete") \
    .format("console") \
    .start()

query.awaitTermination()

这个例子展示了如何使用Spark Streaming处理实时日志数据,按时间窗口和状态码进行聚合分析。

5. 保持学习和探索的态度

image.png

大数据领域发展迅速,新技术和新工具不断涌现。保持开放和学习的心态至关重要。比如,你可以关注Apache Spark的最新版本更新,尝试新的功能;或者探索与Spark集成的其他工具,如Apache Kafka用于实时数据接入,或者Delta Lake用于构建可靠的数据湖。

记住,当初我们是如何"叉会腰"的。在大数据的世界里,永远有新的挑战等着我们去征服。保持那份初心和热情,你会发现自己总能在这个领域找到新的乐趣和成就感。

Spark在企业级应用中的实战经验

作为一个从零开始学习大数据的开发者,我深知将理论知识应用到实际企业环境中的挑战。让我们探讨一下Spark在企业级应用中的一些常见场景和最佳实践。

1. 数据湖构建与管理

image.png

在现代企业中,数据湖已成为管理和分析海量数据的重要工具。Spark在数据湖的构建和管理中扮演着关键角色。

from delta import *
from pyspark.sql.functions import *

# 配置Spark以使用Delta Lake
spark = SparkSession.builder \
    .appName("DeltaLakeExample") \
    .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") \
    .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") \
    .getOrCreate()

# 读取数据并写入Delta表
df = spark.read.format("csv").option("header", "true").load("/path/to/data.csv")
df.write.format("delta").mode("overwrite").save("/path/to/delta/table")

# 读取Delta表并进行更新
deltaTable = DeltaTable.forPath(spark, "/path/to/delta/table")
deltaTable.update(
    condition = expr("id = 100"),
    set = { "name": lit("New Name") }
)

# 时间旅行查询
df_at_version = spark.read.format("delta").option("versionAsOf", 0).load("/path/to/delta/table")

这个例子展示了如何使用Spark和Delta Lake构建一个简单的数据湖,支持ACID事务和时间旅行查询。记住,"糙快猛"并不意味着忽视数据的可靠性和一致性。

2. 实时数据处理与分析

在我转行学习大数据的过程中,实时数据处理是一个让我感到既兴奋又有挑战的领域。Spark Streaming结合Kafka可以构建强大的实时数据处理管道:
image.png

from pyspark.sql import SparkSession
from pyspark.sql.functions import from_json, col
from pyspark.sql.types import StructType, StringType, IntegerType

# 创建SparkSession
spark = SparkSession.builder \
    .appName("KafkaSparkStreaming") \
    .config("spark.jars.packages", "org.apache.spark:spark-sql-kafka-0-10_2.12:3.1.2") \
    .getOrCreate()

# 定义schema
schema = StructType() \
    .add("id", StringType()) \
    .add("name", StringType()) \
    .add("age", IntegerType())

# 从Kafka读取数据
df = spark \
    .readStream \
    .format("kafka") \
    .option("kafka.bootstrap.servers", "localhost:9092") \
    .option("subscribe", "test-topic") \
    .load()

# 解析JSON数据
parsed_df = df.select(from_json(col("value").cast("string"), schema).alias("data")).select("data.*")

# 处理数据
result = parsed_df.groupBy("age").count()

# 输出结果到控制台
query = result \
    .writeStream \
    .outputMode("complete") \
    .format("console") \
    .start()

query.awaitTermination()

这个例子展示了如何使用Spark Streaming从Kafka读取数据,并进行实时处理。在实际应用中,你可能需要处理更复杂的业务逻辑,但基本框架是类似的。

3. 大规模机器学习

image.png

当我开始学习机器学习时,我意识到在大规模数据集上训练模型是一个巨大的挑战。Spark MLlib提供了分布式机器学习的能力,让我们能够处理海量数据:

from pyspark.ml import Pipeline
from pyspark.ml.classification import RandomForestClassifier
from pyspark.ml.feature import StringIndexer, VectorAssembler
from pyspark.ml.evaluation import MulticlassClassificationEvaluator

# 假设我们已经有了一个大规模数据集
data = spark.read.parquet("/path/to/large/dataset")

# 准备特征
categorical_cols = ["category1", "category2"]
numeric_cols = ["feature1", "feature2", "feature3"]

stages = []
for categoricalCol in categorical_cols:
    stringIndexer = StringIndexer(inputCol = categoricalCol, outputCol = categoricalCol + "Index")
    stages += [stringIndexer]

assemblerInputs = [c + "Index" for c in categorical_cols] + numeric_cols
assembler = VectorAssembler(inputCols=assemblerInputs, outputCol="features")
stages += [assembler]

# 创建和训练随机森林模型
rf = RandomForestClassifier(labelCol="label", featuresCol="features", numTrees=100)
stages += [rf]

pipeline = Pipeline(stages = stages)

# 划分训练集和测试集
(trainingData, testData) = data.randomSplit([0.7, 0.3])

# 训练模型
model = pipeline.fit(trainingData)

# 在测试集上评估模型
predictions = model.transform(testData)
evaluator = MulticlassClassificationEvaluator(labelCol="label", predictionCol="prediction", metricName="accuracy")
accuracy = evaluator.evaluate(predictions)
print("Test Accuracy = %g" % accuracy)

这个例子展示了如何使用Spark MLlib构建一个完整的机器学习流水线,包括特征工程、模型训练和评估。记住,"糙快猛"的精神在这里同样适用:先搭建一个基本的模型,然后逐步优化和改进。

4. 性能调优的艺术

image.png

在我的学习过程中,我发现性能调优是一门需要不断实践和积累经验的艺术。这里有一些高级的调优技巧:

image.png

  1. 分区调优:
# 重分区以提高并行度
df = df.repartition(spark.sparkContext.defaultParallelism * 2)

# 按照常用的过滤或join键重分区
df = df.repartition(col("join_key"))
  1. 广播变量与累加器:

image.png

from pyspark.sql.functions import broadcast

# 使用广播join
small_df = spark.table("small_table")
result = large_df.join(broadcast(small_df), "join_key")

# 使用累加器
accum = spark.sparkContext.accumulator(0)
def count_nulls(x):
    if x is None:
        accum.add(1)

df.foreach(lambda row: count_nulls(row.field))
print("Number of null values: {}".format(accum.value))
  1. 缓存策略:
    image.png
from pyspark.storage import StorageLevel

# 使用不同的存储级别
df.persist(StorageLevel.MEMORY_AND_DISK)

5. 与其他大数据技术的集成

在实际工作中,Spark常常需要与其他大数据技术协同工作。例如,与Hive集成进行大规模数据仓库查询:
image.png

from pyspark.sql import SparkSession

# 创建支持Hive的SparkSession
spark = SparkSession.builder \
    .appName("SparkHiveIntegration") \
    .config("spark.sql.warehouse.dir", "/path/to/hive/warehouse") \
    .enableHiveSupport() \
    .getOrCreate()

# 执行Hive查询
result = spark.sql("SELECT * FROM my_hive_table WHERE date > '2023-01-01'")
result.show()

或者与HBase集成进行快速的键值存储:

# 注意:这需要相应的HBase连接器
df = spark.read \
    .format("org.apache.hadoop.hbase.spark") \
    .option("hbase.table", "my_table") \
    .option("hbase.columns.mapping", "key_field STRING :key, field1 STRING c1:f1, field2 INT c1:f2") \
    .load()

结语:持续学习,不断突破

image.png

回顾我从零开始学习大数据的journey,我深深体会到"糙快猛"学习方法的重要性。

在Spark这样复杂而强大的技术面前,我们不应该被完美主义所束缚。相反,我们应该勇于尝试,在实践中学习,在错误中成长。

记住,当我们面对看似不可能的挑战时,要保持那份"可把我牛逼坏了,让我叉会腰儿"的自信和决心。每一次你解决了一个棘手的数据问题,优化了一个复杂的查询,或者部署了一个高性能的Spark应用,你都在向着成为大数据专家的目标迈进一步。

在这个数据驱动的时代,Spark的学习之旅永无止境。新的版本,新的特性,新的最佳实践不断涌现。保持好奇心,保持学习的热情,你会发现自己总能在这个领域找到新的挑战和机遇。

让我们一起在Spark的海洋中探索,让数据的力量在我们手中绽放。记住,你已经从一个初学者成长为能够处理复杂大数据问题的开发者。继续前进,下一个里程碑已在眼前!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

51单片机学习(4)

一、串口通信 1.串口通信介绍 写完串口函数时进行模块化编程,模块化编程之后要对其进行注释,以便之后使用模块化函数,对模块化.c文件中的每一个函数进行注释。 注意:一个函数不能既在主函数又在中断函数中 模式1最常用&#xf…

《Towards Black-Box Membership Inference Attack for Diffusion Models》论文笔记

《Towards Black-Box Membership Inference Attack for Diffusion Models》 Abstract 识别艺术品是否用于训练扩散模型的挑战,重点是人工智能生成的艺术品中的成员推断攻击——copyright protection不需要访问内部模型组件的新型黑盒攻击方法展示了在评估 DALL-E …

二、GD32F407VET6使用定时器点灯

零、所需文件及环境: 1、第一章建立好的LED灯闪烁程序 2、编译环境MDK5(KEIL5) 3、一个GD32F407VET6硬件 4、一个下载器j-link 或 st-link等 5.代码编辑器 Notepad (可以不要 用记事本也能编译 都是习惯的问题 壹、复制LED灯闪烁程序 1.1 复制le…

25w的理想L6简约民宿,15W的哪吒L拎包入住

文 | AUTO芯球 作者 | 谦行 25w买理想L6 ? 踩坑咯!你是没看哪吒L吧! 哪吒是杂牌?兄弟!买车要动脑子! 你先去哪吒店里体验一下!肠子都给你悔青! 上有老下有小,要精打…

MongoDB教程(十七):MongoDB主键类型ObjectId

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、Object…

Spring AOP(2)原理(代理模式和源码解析)

目录 一、代理模式 二、静态代理 三、动态代理 1、JDK动态代理 (1)JDK动态代理实现步骤 (2)定义JDK动态代理类 (3)代码简单讲解 2、CGLIB动态代理 (1)CGLIB 动态代理类实现…

Spring系列-04-事件机制,监听器,模块/条件装配

事件机制&监听器 SpringFramework中设计的观察者模式-掌握 SpringFramework 中, 体现观察者模式的特性就是事件驱动和监听器。监听器充当订阅者, 监听特定的事件;事件源充当被观察的主题, 用来发布事件;IOC 容器本身也是事件广播器, 可以理解成观察…

ArcGIS Pro不能编辑ArcGIS10.X的注记的解决办法

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 一、问题 我们利用ArcGIS Pro编辑ArcGIS10.X系列软件生成的注记要素类的时候,会提示不…

FinClip 率先入驻 AWS Marketplace,加速全球市场布局

近日,凡泰极客旗下的小程序数字管理平台 FinClip 已成功上线亚马逊云科技(AWS)Marketplace。未来,FinClip 将主要服务于海外市场的开放银行、超级钱包、财富管理、社交电商、智慧城市解决方案等领域。 在全球市场的多样性需求推动…

KAFKA搭建教程

KAFKA搭建教程 期待您的关注 KAFKA学习笔记 帮助更多人 目录 KAFKA搭建教程 1.下载Kafka并解压 2.添加环境变量 3.修改 server.properties 文件 4.将kafka复制到其它节点 5.修改node1、node2节点的broker.id 6.将master的环境变量同步到node1、 node2 7.启动zookeeper…

Elasticsearch:评估搜索相关性 - 第 1 部分

作者:来自 Elastic Thanos Papaoikonomou, Thomas Veasey 这是一系列博客文章中的第一篇,讨论如何在更好地理解 BEIR 基准的背景下考虑评估你自己的搜索系统。我们将介绍具体的技巧和技术,以便在更好地理解 BEIR 的背景下改进你的搜索评估流程…

17_高级进程间通信 UNIX域套接字1

非命名的UNIX域套接字 第1个参数domain,表示协议族,只能为AF_LOCAL或者AF_UNIX; 第2个参数type,表示类型,只能为0。 第3个参数protocol,表示协议,可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STR…

视觉巡线小车——STM32+OpenMV(三)

目录 前言 一、OpenMV代码 二、STM32端接收数据 1.配置串口 2.接收数据并解析 总结 前言 通过视觉巡线小车——STM32OpenMV(二),已基本实现了减速电机的速度闭环控制。要使小车能够自主巡线,除了能够精准的控制速度之外&#xff0…

【BUG】已解决:raise KeyError(key) from err KeyError: (‘name‘, ‘age‘)

已解决:raise KeyError(key) from err KeyError: (‘name‘, ‘age‘) 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识&#xf…

第十课:telnet(远程登入)

如何远程管理网络设备? 只要保证PC和路由器的ip是互通的,那么PC就可以远程管理路由器(用telnet技术管理)。 我们搭建一个下面这样的简单的拓扑图进行介绍 首先我们点击云,把云打开,点击增加 我们绑定vmn…

idea如何让包结构分层

文章目录 前言1.选中前项目包结构2.取消后项目包结构3.情况二 前言 在大型项目中,代码的分层管理至关重要。IDEA编辑器提供了强大的package分层结构功能,帮助开发者更好地组织和管理代码。通过合理配置,我们可以清晰地看到各个package之间的…

【BUG】已解决:java.lang.reflect.InvocationTargetException

已解决:java.lang.reflect.InvocationTargetException 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开发…

Mysql-索引结构

一.什么是索引? 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引 二.无索引的情况 找到…

【效率提升】程序员常用Shell脚本

文章目录 常用Shell脚本一. 定期更新分区数据二、获取系统资源的使用情况 常用Shell脚本 一. 定期更新分区数据 在某些场景下,我们需要对N年前某一分区的数据进行删除,并添加今年该对应分区的数据,实现数据的流动式存储。 #!/bin/bash dt$…

NFT革命:数字资产的确权、营销与元宇宙的未来

目录 1、NFT:数字社会的数据确权制度 2、基于低成本及永久产权的文化发现 3、PFP:从“小图片”到“身份表达”,再到社区筛选 4、透明表达:NFT 在数字化营销中的商业价值 5、可编程性:赋予 NFT 无限可能的应用 5.…