spark结课之tip2

 spark常用方法总结:

一、从内部创建RDD

(1).通过并行化集合(Parallelized Collections):

可以使用SparkContextparallelize方法将一个已有的集合转换为RDD。

基本语法:
parallelize(collection, numSlices=None)
基础代码示例:
import org.apache.spark.{SparkConf, SparkContext}val conf = new SparkConf().setAppName("ParallelizeExample").setMaster("local")
val sc = new SparkContext(conf)val data = Array(1, 2, 3, 4, 5)
val rdd = sc.parallelize(data)rdd.foreach(println)sc.stop()
效果展示:

(2).makeRDD()创建

版本的 Spark 中,通常使用 parallelize() 方法来创建 RDD,这个方法与 makeRDD() 类似,都是用来从集合创建 RDD。

基本语法:
parallelize(collection, numSlices=None)
基础代码示例:
from pyspark import SparkContext# 创建 SparkContext 对象
sc = SparkContext("local", "parallelize Example")# 创建一个列表
data = [1, 2, 3, 4, 5]# 使用 parallelize() 方法创建 RDD
rdd = sc.parallelize(data)# 打印 RDD 中的元素
for element in rdd.collect():print(element)
效果展示:

      

 二、从外部创建RDD

Spark提供了多种方式来读取外部存储系统中的数据,通过外部存储系统(如HDFS、HBase等)读取数据创建RDD基础方式有五种:

1.文本文件:textFile

textFile() 方法是 Apache Spark 中用于从文件系统中读取文本文件的函数

基本语法:
textFile(path, minPartitions=None, use_unicode=True)
基础代码示例:
from pyspark import SparkContext# 创建 SparkContext 对象
sc = SparkContext("local", "textFile Example")# 读取文本文件
lines = sc.textFile("path/to/file.txt")# 打印每一行
for line in lines.collect():print(line)

2.Sequence文件:sequenceFile()   [扩充]

sequenceFile()  方法用于在 Apache Spark 中读取 Hadoop SequenceFile 格式的文件,并将其作为 RDD 返回。SequenceFile 是 Hadoop 中一种常用的二进制文件格式,通常用于存储键-值对数据。

​基本语法:
sequenceFile(path, keyClass=None, valueClass=None, keyConverter=None, valueConverter=None, minSplits=None, batchSize=0)
解释:
用法解读
collection是要转换为 RDD 的集合,通常是一个列表
path要读取的 SequenceFile 文件的路径
keyClass键的类名(可选)
valueClass值的类名(可选)
keyConverter键的转换器(可选)
valueConverter值的转换器(可选)
minSplits最小分片数(可选)
batchSize批处理大小(可选)

基础代码示例:
from pyspark import SparkContext# 创建 SparkContext 对象
sc = SparkContext("local", "sequenceFile Example")# 读取 SequenceFile 文件并创建 RDD
data = sc.sequenceFile("hdfs://path/to/sequence_file")# 打印 RDD 中的元素
for key, value in data.collect():print(key, value)

3.对象文件(Object files):

 objectFile() 方法用于在 Apache Spark 中读取以序列化形式保存的对象文件,并将其作为 RDD 返回。这种文件格式通常用于将对象序列化为字节流,并存储在文件中,以便在后续操作中进行读取和处理。


​基本语法:
objectFile(path, minPartitions=None, batchSize=0)

基础代码示例:
from pyspark import SparkContext# 创建 SparkContext 对象
sc = SparkContext("local", "objectFile Example")# 读取对象文件并创建 RDD
data = sc.objectFile("hdfs://path/to/object_file")# 打印 RDD 中的元素
for obj in data.collect():print(obj)

 

4.Hive表:sql() 函数

在Spark中配置了Hive支持,你可以使用 sql() 函数执行Hive查询并将结果作为RDD返回。sql() 方法是 SparkSession 类的一个成员方法,用于执行 SQL 查询并返回结果作为 DataFrame。sql() 方法可以让你直接在 Spark 中执行 SQL 查询,而不需要编写基于 RDD 的代码。

​基本语法:
DataFrame = sql(sqlQuery)

基础代码示例:
from pyspark.sql import SparkSession# 创建 SparkSession 对象
spark = SparkSession.builder \.appName("SQL Example") \.getOrCreate()# 创建 DataFrame
df = spark.createDataFrame([(1, 'Alice'), (2, 'Bob'), (3, 'Charlie')], ["id", "name"])# 注册临时表
df.createOrReplaceTempView("people")# 执行 SQL 查询
result = spark.sql("SELECT * FROM people")# 显示结果
result.show()

5.JDBC连接:

使用 jdbc() 函数来连接关系型数据库,并通过执行SQL查询来创建RDD。

​基本语法:
jdbcDF = spark.read \.jdbc(url="jdbc:postgresql:dbserver", table="schema.tablename",properties={"user": "username", "password": "password"})

基础代码示例:
from pyspark.sql import SparkSession
spark = SparkSession.builder \.appName("JDBC Example") \.config("spark.driver.extraClassPath", "path/tobc-driver.jar") \.getOrCreate()jdbcDF = spark.read \.format("jdbc") \.option("url", "jdbc:postgresql://database_server:port/database_name") \.option("dbtable", "table_name") \.option("user", "username") \.option("password", "password") \.load()
jdbcDF.show()
spark.stop()

​操作算子:

Scala集合提供了丰富的计算算子,用于实现集合/数组的计算,这些计算子一般针对于List、Array、Set、Map、Range、Vector、Iterator等都可以适用

1.map()方法:

map() 方法用于对集合(如列表、数组、映射等)中的每个元素应用一个函数,并返回结果的新集合。
 

​基本语法:
def map[B](f: (A) ⇒ B): List[B]

基础代码示例:
val list = List(1, 2, 3, 4, 5)
val incremented = list.map(x => x + 1)
// incremented: List[Int] = List(2, 3, 4, 5, 6)

效果展示:​


2.sortBy() 方法:

sortBy() 方法用于根据指定的标准对集合中的元素进行排序,并返回排序后的新集合。
​基本语法:
def sortBy[B](f: (A) ⇒ B)(implicit ord: Ordering[B]): List[A]

基础代码示例:
val list = List(3, 1, 4, 1, 5, 9, 2, 6)
val sortedList = list.sortBy(x => x)
// sortedList: List[Int] = List(1, 1, 2, 3, 4, 5, 6, 9)

效果展示:​

3.collect() 方法:

用于对集合中的元素进行筛选和转换,并返回符合条件的新集合。

​基本语法:
def collect[B](pf: PartialFunction[A, B]): List[B]

基础代码示例:
val list = List(1, 2, 3, "four", 5.5, "six")val transformedList = list.collect {case i: Int => i * 2  // 对于整数类型的元素,将其乘以2
}// transformedList: List[Int] = List(2, 4, 6)
效果展示:​

4.flatMap()方法:

flatMap() 方法是集合类(如列表、数组等)的常见操作之一,它结合了 map()flatten() 两个操作,常用于在集合的元素上应用一个函数,并将结果展平成一个新的集合。

​基本语法:
def flatMap[B](f: (A) => IterableOnce[B]): IterableOnce[B]

基础代码示例:
val list = List(1, 2, 3, 4)
val result = list.flatMap(x => List(x, x * 2))// result: List[Int] = List(1, 2, 2, 4, 3, 6, 4, 8)

效果展示:​

5.take()方法:

take() 方法用于从集合中获取指定数量的元素,返回一个新的集合。

​基本语法:
def take(n: Int): Repr

基础代码示例:
val list = List(1, 2, 3, 4, 5)// 取前3个元素
val result1 = list.take(3)
// result1: List[Int] = List(1, 2, 3)// 对于空集合,take() 方法返回一个空集合
val emptyList = List.empty[Int]
val result2 = emptyList.take(3)
// result2: List[Int] = List()// 如果指定的数量大于集合中的元素数量,将返回整个集合
val result3 = list.take(10)
// result3: List[Int] = List(1, 2, 3, 4, 5)

效果展示:


转换操作:

1.union()方法:

union() 方法用于将两个集合合并成一个新的集合,去除重复的元素。它是集合类的方法之一,适用于 SetSeq 类型的集合。


基础代码示例:
val set1 = Set(1, 2, 3)
val set2 = Set(3, 4, 5)val result = set1.union(set2)
// result: Set[Int] = Set(1, 2, 3, 4, 5)

效果展示:​


2.filter() 方法:


基础代码示例:
val list = List(1, 2, 3, 4, 5)val evenNumbers = list.filter(_ % 2 == 0)
// evenNumbers: List[Int] = List(2, 4)

效果展示:​

用于从集合中筛选出满足特定条件的元素,然后返回一个包含满足条件的元素的新集合。

3.distinst()方法:

distinct() 方法用于从集合中移除重复的元素,并返回一个包含唯一元素的新集合。这个方法适用于 SeqSetMap 类型的集合。

基础代码示例:
val list = List(1, 2, 2, 3, 3, 4, 5, 5)val uniqueList = list.distinct
// uniqueList: List[Int] = List(1, 2, 3, 4, 5)

效果展示:​

4.intersection() 方法:

用于获取两个RDD(弹性分布式数据集)之间的交集。
基础代码示例:
import org.apache.spark.{SparkConf, SparkContext}object RDDIntersectionExample {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("RDDIntersectionExample").setMaster("local[*]")val sc = new SparkContext(conf)// 创建两个RDDval rdd1 = sc.parallelize(Seq(1, 2, 3, 4, 5))val rdd2 = sc.parallelize(Seq(4, 5, 6, 7, 8))// 计算两个RDD的交集val intersectionRDD = rdd1.intersection(rdd2)// 打印结果intersectionRDD.collect().foreach(println)sc.stop()}
}

效果展示:​

5.subtract() 方法:

用于从一个 RDD 中移除另一个 RDD 中包含的元素,得到两个 RDD 的差集。

基础代码示例:
import org.apache.spark.{SparkConf, SparkContext}object RDDSubtractExample {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("RDDSubtractExample").setMaster("local[*]")val sc = new SparkContext(conf)// 创建两个RDDval rdd1 = sc.parallelize(Seq(1, 2, 3, 4, 5))val rdd2 = sc.parallelize(Seq(4, 5, 6, 7, 8))// 计算两个RDD的差集val subtractRDD = rdd1.subtract(rdd2)// 打印结果subtractRDD.collect().foreach(println)sc.stop()}
}

效果展示:

6.cartesian() 方法:

用于计算两个 RDD 的笛卡尔积(Cartesian product)。笛卡尔积是两个集合之间的所有可能的组合,其中一个元素来自第一个集合,另一个元素来自第二个集合。

基础代码示例:
import org.apache.spark.{SparkConf, SparkContext}object RDDCartesianExample {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("RDDCartesianExample").setMaster("local[*]")val sc = new SparkContext(conf)// 创建两个RDDval rdd1 = sc.parallelize(Seq("A", "B", "C"))val rdd2 = sc.parallelize(Seq(1, 2, 3))// 计算两个RDD的笛卡尔积val cartesianRDD = rdd1.cartesian(rdd2)// 打印结果cartesianRDD.collect().foreach(println)sc.stop()}
}

效果展示:

创建键值对RDD的方法:

1.reduceByKey():

用于将具有相同键的元素进行归约操作。它接收一个函数作为参数,该函数定义了对具有相同键的值进行合并的方式,并返回一个新的 RDD。

基础代码示例:
import org.apache.spark.{SparkConf, SparkContext}object ReduceByKeyExample {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("ReduceByKeyExample").setMaster("local[*]")val sc = new SparkContext(conf)// 创建一个包含键值对的RDDval data = Seq(("a", 1), ("b", 2), ("a", 3), ("b", 4), ("c", 5))val rdd = sc.parallelize(data)// 对具有相同键的值进行求和val result = rdd.reduceByKey(_ + _)// 打印结果result.collect().foreach(println)sc.stop()}
}

效果展示:

2.groupBykey():

用于将具有相同键的元素进行分组。它接收一个键值对 RDD 作为输入,并返回一个新的 RDD,其中的元素是按键分组的。

基础代码示例:
import org.apache.spark.{SparkConf, SparkContext}object GroupByKeyExample {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("GroupByKeyExample").setMaster("local[*]")val sc = new SparkContext(conf)// 创建一个包含键值对的RDDval data = Seq(("a", 1), ("b", 2), ("a", 3), ("b", 4), ("c", 5))val rdd = sc.parallelize(data)// 按键分组val groupedRDD = rdd.groupByKey()// 打印结果groupedRDD.collect().foreach(println)sc.stop()}
}

效果展示:

3.combineByKey() :

用于执行基于键的聚合操作的高级转换函数之一。它提供了一种灵活的方式来对每个键的值进行聚合,而不需要事先进行预先聚合或排序。

基础代码示例:
 
import org.apache.spark.{SparkConf, SparkContext}object CombineByKeyExample {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("CombineByKeyExample").setMaster("local[*]")val sc = new SparkContext(conf)// 创建一个包含键值对的RDDval rdd = sc.parallelize(Seq(("apple", 3), ("banana", 5), ("apple", 7), ("banana", 2), ("orange", 1)))// 使用combineByKey方法进行基于键的聚合操作val aggregatedRDD = rdd.combineByKey(createCombiner = (v: Int) => (v, 1), // 初始化值为(v, 1),其中v是值,1表示计数mergeValue = (acc: (Int, Int), v: Int) => (acc._1 + v, acc._2 + 1), // 将新值合并到已存在的聚合值中,并更新计数mergeCombiners = (acc1: (Int, Int), acc2: (Int, Int)) => (acc1._1 + acc2._1, acc1._2 + acc2._2) // 合并不同分区的聚合值,并更新计数)// 打印结果aggregatedRDD.collect().foreach(println)sc.stop()}
}
效果展示:

RDD的连接方法:

1.join()方法:

用于将两个 RDD 按照键进行连接操作。它接收另一个键值对 RDD 作为参数,并返回一个新的 RDD,其中的元素是两个原始 RDD 中具有相同键的元素的笛卡尔积。

基础代码示例:
 
import org.apache.spark.{SparkConf, SparkContext}object JoinExample {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("JoinExample").setMaster("local[*]")val sc = new SparkContext(conf)// 创建两个包含键值对的RDDval rdd1 = sc.parallelize(Seq(("a", 1), ("b", 2), ("c", 3)))val rdd2 = sc.parallelize(Seq(("a", "apple"), ("b", "banana"), ("c", "cherry")))// 使用join方法进行连接操作val joinedRDD = rdd1.join(rdd2)// 打印结果joinedRDD.collect().foreach(println)sc.stop()}
}
效果展示:

2.rightOuterJoin():

右外连接是一种数据库连接操作,它返回两个数据集中所有右表(第二个数据集)的记录,以及左表(第一个数据集)中与右表匹配的记录。如果左表中没有匹配的记录,则会为其添加 null 值。

基础代码示例:
import org.apache.spark.{SparkConf, SparkContext}object RightOuterJoinExample {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("RightOuterJoinExample").setMaster("local[*]")val sc = new SparkContext(conf)// 创建两个包含键值对的RDDval rdd1 = sc.parallelize(Seq(("a", 1), ("b", 2), ("c", 3)))val rdd2 = sc.parallelize(Seq(("a", "apple"), ("b", "banana"), ("d", "date")))// 使用rightOuterJoin方法进行右外连接操作val joinedRDD = rdd1.rightOuterJoin(rdd2)// 打印结果joinedRDD.collect().foreach(println)sc.stop()}
}

效果展示:

3.leftOuterJoin():

左外连接是一种数据库连接操作,它返回两个数据集中所有左表(第一个数据集)的记录,以及右表(第二个数据集)中与左表匹配的记录。如果右表中没有匹配的记录,则会为其添加 null 值。

基础代码示例:
import org.apache.spark.{SparkConf, SparkContext}object LeftOuterJoinExample {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("LeftOuterJoinExample").setMaster("local[*]")val sc = new SparkContext(conf)// 创建两个包含键值对的RDDval rdd1 = sc.parallelize(Seq(("a", 1), ("b", 2), ("c", 3)))val rdd2 = sc.parallelize(Seq(("a", "apple"), ("b", "banana"), ("d", "date")))// 使用leftOuterJoin方法进行左外连接操作val joinedRDD = rdd1.leftOuterJoin(rdd2)// 打印结果joinedRDD.collect().foreach(println)sc.stop()}
}

效果展示:

4.fullOuterJoin():

全外连接是一种数据库连接操作,它返回两个数据集中所有记录的并集,并将匹配的记录组合在一起。如果两个数据集中都没有匹配的记录,则会为其添加 null 值。

基础代码示例:
import org.apache.spark.{SparkConf, SparkContext}object FullOuterJoinExample {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("FullOuterJoinExample").setMaster("local[*]")val sc = new SparkContext(conf)// 创建两个包含键值对的RDDval rdd1 = sc.parallelize(Seq(("a", 1), ("b", 2), ("c", 3)))val rdd2 = sc.parallelize(Seq(("a", "apple"), ("b", "banana"), ("d", "date")))// 使用fullOuterJoin方法进行全外连接操作val joinedRDD = rdd1.fullOuterJoin(rdd2)// 打印结果joinedRDD.collect().foreach(println)sc.stop()}
}

效果展示:

5.zip() :

用于将两个 RDD 中的元素一一配对的方法之一。它将两个 RDD 中的元素按顺序一一配对,形成新的 RDD,其中每个元素是一个由两个 RDD 中对应位置的元素组成的元组。

基础代码示例:
import org.apache.spark.{SparkConf, SparkContext}object ZipExample {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("ZipExample").setMaster("local[*]")val sc = new SparkContext(conf)// 创建两个包含元素的RDDval rdd1 = sc.parallelize(Seq(1, 2, 3, 4))val rdd2 = sc.parallelize(Seq("apple", "banana", "orange", "grape"))// 使用zip方法将两个RDD进行配对val zippedRDD = rdd1.zip(rdd2)// 打印结果zippedRDD.collect().foreach(println)sc.stop()}
}

效果展示:

大家有什么好的方法和建议,可以发布在评论区或者留言给我, 小杨还有待改进的地方,望各位大师监督!

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

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

相关文章

AI系列:大语言模型的RAG(检索增强生成)技术(下)-- 使用LlamaIndex

目录 前言什么是LlamaIndex?LlamaIndex代码设置embedding模型设置LLM模型索引查询机 验证使用感受参考资料 前言 继上一篇文章AI系列:大语言模型的RAG(检索增强生成)技术(上),这篇文章主要以LlamaIndex为…

银行业数据运营场景下的数据埋点方案

1、引言 随着金融科技的快速发展,银行业的数据运营变得日益重要。数据埋点作为数据收集的重要手段,对于银行业务的精细化运营、风险管理和产品迭代等方面起着至关重要的作用。本方案将针对银行业数据运营场景,设计一套完整的数据埋点方案&am…

【生信技能树】GEO数据挖掘全流程

R包的安装,每次做分析的时候先运行这段代码把R包都安装好了,这段代码不需要任何改动,每次分析直接运行。 options("repos""https://mirrors.ustc.edu.cn/CRAN/") if(!require("BiocManager")) install.packag…

思源笔记如何结合群晖WebDav实现云同步数据

文章目录 1. 开启群晖WebDav 服务2. 本地局域网IP同步测试3. 群晖安装Cpolar4. 配置远程同步地址5. 笔记远程同步测试6. 固定公网地址7. 配置固定远程同步地址 在数字化时代,信息的同步与共享变得尤为重要。无论是个人用户还是企业团队,都渴望能够实现跨…

创建存储过程

一、DDL与DML CREATE TABLE student (id INT PRIMARY KEY AUTO_INCREMENT,createDate DATETIME NOT NULL,userName VARCHAR(255) NOT NULL,phone VARCHAR(20) NOT NULL,age INT NOT NULL,sex ENUM(男, 女) NOT NULL,introduce TEXT ); INSERT INTO student (createDate, userN…

透明加密软件推荐:哪款实用又高效?

透明加密软件是一种专门针对文件保密需求的计算机加密工具。 其核心在于“透明”二字,意味着整个加密过程对于使用者来说是无形且无感知的。 当用户进行文件的日常操作,如打开、编辑或保存时,透明加密软件会在后台自动进行加密和解密工作&a…

Keil编程不同驱动文件引用同一个常量的处理方法

基础不牢,地动山摇,最近单片机编程又遇到一个基础问题。 我在头文件中定义了一个常量同时给两个驱动文件使用,封装的时候编译没问题,但是在main函数中引用驱动函数的时候就出现了重定义的问题,如下如所示。 解决方法很…

Windows 11 下 kafka 的安装踩坑

安装 windows系统kafka小白入门篇——下载安装,环境配置,入门代码书写(推荐) kafka在windows下安装和使用入门教程 问题1 参考链接 运行kafka集成的zookeeper时,命令:bin\windows\zookeeper-server-star…

05. 【Java教程】第一个 Java 程序

本节我们将以Windows操作系统为例,编写并执行第一个Java程序。在这之前,请确保你的操作系统上已经安装了JDK 1. 编译程序 大家可能有个疑问,为什么需要编译程序呢?计算机不能直接执行我们编写的源代码吗? 这是由于计…

CPU利用率使用教程

本文主要参考: 一文让你学到 nmon最详尽的用法 Linux性能监控命令_nmon 安装与使用 如果你是在Ubuntu上安装nmon,使用: apt install nmon安装好后,直接运行 $:nmon #运行如果是后台抓数据: -f 参数: 生成文件,文件…

python 虚拟环境多种创建方式

【一】说明介绍 (1)什么是虚拟环境 在Python中,虚拟环境(Virtual Environment)是一个独立的、隔离的Python运行环境,它拥有自己的Python解释器、第三方库和应用程序。通过创建虚拟环境,可以确…

【刷题(2)】矩阵

一、矩阵问题基础 遍历: for i in range(len(matrix[0])): for j in range(len(matrix): while 倒序遍历: for i in range(right,left,-1) 临时存储:temp w,h:len(matrix[0])-1 len(matrix)-1 left,right,top,bottom:0 len(matrix[0])-1 0 l…

Cesium 3DTileset Style 原理简析

Cesium 3DTileset Style 原理简析 应用层会看到这样的使用。那么原理是什么, 为啥写 height, 除了这个还有啥? const tileset await Cesium.Cesium3DTileset.fromUrl("../../public/tileset/building/tileset.json"); tileset.style new Cesium.Cesium3DTileSty…

HarmonyOS应用模型Stage基本介绍

文章目录 <font colorcoral> HarmonyOS应用模型概况<font colorcoral> Stage模型基本概念<font colorcoral> Stage模型UIAbiliry的生命周期<font colorcoral> Stage模型的配置文件<font colorcoral> 写在后面的话<font colorcoral>Referen…

【八大排序算法】插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序

文章目录 一、排序的相关概念二、排序类型三、排序算法实现插入排序1.直接插入排序2.希尔排序 选择排序3.简单选择排序4.堆排序 交换排序5.冒泡排序6.快速排序递归实现非递归实现 7.归并排序递归实现非递归实现 8.计数排序 四、总结 一、排序的相关概念 排序&#xff1a;根据数…

【LAMMPS学习】八、基础知识(6.5)PyLammps 教程

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

[JAVASE] 类和对象(二)

目录 一. 封装 1.1 面向对象的三大法宝 1.2 封装的基本定义与实现 二. 包 2.1 包的定义 2.2 包的作用 2.3 包的使用 2.3.1 导入类 2.3.2 导入静态方法 三. static 关键字 (重要) 3.1 static 的使用 (代码例子) 3.1.1 3.1.2 3.1.3 3.1.4 四. 总结 一. 封装 1.1 面向对象…

推荐网站(9)pixabay免费可商用的图片、视频、插画、矢量图、音乐

今天推荐一款可以免费可商用的图片、视频、插画、矢量图、音乐的资源网站&#xff0c;这里面的所以东西都是免费的&#xff0c;并且可以商用。对那些做视频剪辑的人来说帮助非常大。它里面的资源非常的丰富&#xff0c;质量也高。 比如搜索下雨 链接直达&#xff1a;https://pi…

如何安装在系统中安装make命令

文章目录 WindowsMacUbuntuCentOS/Red Hat make是系统比较基础的命令&#xff0c;一般会自己携带&#xff0c;如果没有就手动安装一下吧。 Windows 从官网下载 make.exe Make for Windows 官网首页&#xff1a;https://www.gnu.org/software/make/ 下载地址&#xff1a;htt…