Scala、Spark SQL 常用方法

目录

数组常用方法

列表操作常用方法

 Scala中常用的查看列表元素的方法有head、init、last、tail和take()。

合并两个列表还可以使用concat()方法。

集合操作常用方法

map()方法

foreach()方法

filter()方法

flatten()方法

 groupBy()方法

​编辑

从内存中读取数据创建RDD

parallelize()方法

 makeRDD()方法

map()方法

sortBy()方法

collect()方法

collect()方法有以下两种操作方式。

 take(N)方法

使用filter()方法进行过滤

使用distinct()方法进行去重

 Spark中的集合操作常用方法(转换操作)

cartesian()方法

 使用键值对RDD的keys和values方法

使用键值对RDD的reduceByKey()方法

1. parallelize()

​​​​​​​2. makeRDD()

 从外部存储系统中读取数据创建RDD

使用map()方法转换数据

使用sortBy()方法进行排序

​​​​​​​使用collect()方法查询数据

​编辑 使用flatMap()方法转换数据

使用take()方法查询某几个值

 使用union()方法合并多个RDD

​​​​​​​使用filter()方法进行过滤

 使用distinct()方法进行去重

使用简单的集合操作

 intersection()方法

subtract()方法

 cartesian()方法

 创建键值对RDD

 使用键值对RDD的keys和values方法

​编辑使用键值对RDD的reduceByKey()方法 

 使用键值对RDD的groupByKey()方法

​​​​​​​使用join()方法连接两个RDD

(1)join()方法

(2)rightOuterJoin()方法

(3)leftOuterJoin()方法

(4)fullOuterJoin()方法

 查看DataFrame数据

1. printSchema:输出数据模式

2. show():查看数据 

show(numRows:Int)查看前n行记录

​编辑 3.first()/head()/take()/takeAsList():获取若干条记录

4.collect()/collectAsList():获取所有数据

将DataFrame注册成为临时表,然后通过SQL语句进行查询

直接在DataFrame对象上进行查询,DataFrame提供了很多查询的方法

​​​​​​​1.where()/filter()方法

(1)where()方法

(2)filter()方法

​编辑2.select()/selectExpr()/col()/apply()方法


数组常用方法

方法

描述

length

返回数组的长度

head

查看数组的第一个元素

tail

查看数组中除了第一个元素外的其他元素

isEmpty

判断数组是否为空

contains(x)

判断数组是否包含元素x

数组是Scala中常用的一种数据结构,数组是一种存储了相同类型元素的固定大小的顺序集合。Scala定义一个数组的语法格式如下。

# 1种方式

var arr: Array[String] = new Array[String](num)

# 2种方式

var arr:Array[String] = Array(元素1,元素2,…)

Scala可以使用range()方法创建区间数组。

使用range()方法前同样需要先通过命令“import Array._”导入包。

列表操作常用方法

方法

描述

def head: A

获取列表的第一个元素

def init:List[A]

返回所有元素,除了最后一个元素

def last:A

获取列表的最后一个元素

def tail:List[A]

返回所有元素,除了第一个元素

def :::(prefix: List[A]): List[A]

在列表开头添加指定列表的元素

def take(n: Int): List[A]

获取列表前n个元素

def contains(elem: Any): Boolean

判断列表是否包含指定元素

 Scala中常用的查看列表元素的方法有headinitlasttailtake()

                •head:查看列表的第一个元素。

                •tail:查看第一个元素之后的其余元素。

                •last:查看列表的最后一个元素。

                •Init:查看除最后一个元素外的所有元素。

                •take():查看列表前n个元素。

合并两个列表还可以使用concat()方法。

用户可以使用contains()方法判断列表中是否包含某个元素,若列表中存在指定的元素则返回true,否则返回false

Scala Set(集合)是没有重复的对象集合,所有的元素都是唯一的

集合操作常用方法

方法

描述

def head: A

获取集合的第一个元素

def init:Set[A]

返回所有元素,除了最后一个

def last:A

获取集合的最后一个元素

def tail:Set[A]

返回所有元素,除了第一个

def ++(elems: A): Set[A]

合并两个集合

def take(n: Int): List[A]

获取列表前n个元素

def contains(elem: Any): Boolean

判断集合中是否包含指定元素

Scala合并两个列表时使用的是:::()concat()方法,而合并两个集合使用的是++()方法。

map()方法

可通过一个函数重新计算列表中的所有元素,并且返回一个包含相同数目元素的新列表。

foreach()方法

map()方法类似,但是foreach()方法没有返回值,只用于对参数的结果进行输出。

filter()方法

可以移除传入函数的返回值为false的元素。

        

flatten()方法

可以将嵌套的结构展开,即flatten()方法可以将一个二维的列表展开成一个一维的列表。

 flatMap()方法

结合了map()方法和flatten()方法的功能,接收一个可以处理嵌套列表的函数,再对返回结果进行连接。

groupBy()方法

可对集合中的元素进行分组操作,返回的结果是一个映射。

 groupBy()方法

从原始数据中抽取4条数据,并存放至列表phone中,使用groupBy()方法根据归属地对列表中的元素进行分组。

从内存中读取数据创建RDD

parallelize()方法

有两个输入参数,说明如下。

        •要转化的集合,必须是Seq集合。Seq表示序列,指的是一类具有一定长度的、可迭代访问的对象,其中每个数据元素均带有一个从0开始的、固定的索引。

        •分区数。若不设分区数,则RDD的分区数默认为该程序分配到的资源的CPU核心数。

 makeRDD()方法

有两种使用方式。

        •第一种方式的使用与parallelize()方法一致;

        •第二种方式是通过接收一个是Seq[(T,Seq[String])]参数类型创建RDD

第二种方式生成的RDD中保存的是T的值,Seq[String]部分的数据会按照Seq[(T,Seq[String])]的顺序存放到各个分区中,一个Seq[String]对应存放至一个分区,并为数据提供位置信息,通过preferredLocations()方法可以根据位置信息查看每一个分区的值。调用makeRDD()时不可以直接指定RDD的分区个数,分区的个数与Seq[String]参数的个数是保持一致的。

map()方法

是一种基础的RDD转换操作,可以对RDD中的每一个数据元素通过某种函数进行转换并返回新的RDD

map()方法是转换操作,不会立即进行计算。

转换操作是创建RDD的第二种方法,通过转换已有RDD生成新的RDD。因为RDD是一个不可变的集合,所以如果对RDD数据进行了某种转换,那么会生成一个新的RDD

sortBy()方法

用于对标准RDD进行排序,有3个可输入参数,说明如下。

        •1个参数是一个函数f:(T) => K,左边是要被排序对象中的每一个元素,右边返回的值是元素中要进行排序的值。

        •2个参数是ascending,决定排序后RDD中的元素是升序的还是降序的,默认是true,即升序排序,如果需要降序排序那么需要将参数的值设置为false

        •3个参数是numPartitions,决定排序后的RDD的分区个数,默认排序后的分区个数和排序之前的分区个数相等,即this.partitions.size

        第一个参数是必须输入的,而后面的两个参数可以不输入。

collect()方法

是一种行动操作,可以将RDD中所有元素转换成数组并返回到Driver端,适用于返回处理后的少量数据。

因为需要从集群各个节点收集数据到本地,经过网络传输,并且加载到Driver内存中,所以如果数据量比较大,会给网络传输造成很大的压力。

因此,数据量较大时,尽量不使用collect()方法,否则可能导致Driver端出现内存溢出问题。

collect()方法有以下两种操作方式。

collect:直接调用collect返回该RDD中的所有元素,返回类型是一个Array[T]数组。

collect[U: ClassTag](f: PartialFunction[T, U])RDD[U]。这种方式需要提供一个标准的偏函数,将元素保存至一个RDD中。首先定义一个函数one,用于将collect方法得到的数组中数值为1的值替换为“one”,将其他值替换为“other”

 take(N)方法

用于获取RDD的前N个元素,返回数据为数组。

take()与collect()方法的原理相似,collect()方法用于获取全部数据,take()方法获取指定个数的数据。

获取RDD的前5个元素

使用union()方法合并多个RDD

union()方法是一种转换操作,用于将两个RDD合并成一个,不进行去重操作,而且两个RDD中每个元素中的值的个数、数据类型需要保持一致。

使用union()方法合并两个RDD 

使用filter()方法进行过滤

filter()方法是一种转换操作,用于过滤RDD中的元素。

filter()方法需要一个参数,这个参数是一个用于过滤的函数,该函数的返回值为Boolean类型。

filter()方法将返回值为true的元素保留,将返回值为false的元素过滤掉,最后返回一个存储符合过滤条件的所有元素的新RDD

创建一个RDD,并且过滤掉每个元组第二个值小于等于1的元素。

使用distinct()方法进行去重

distinct()方法是一种转换操作,用于RDD的数据去重,去除两个完全相同的元素,没有参数。

创建一个带有重复数据的RDD,并使用distinct()方法去重。

 Spark中的集合操作常用方法(转换操作)

 intersection()方法

intersection()方法用于求出两个RDD的共同元素,即找出两个RDD的交集,参数是另一个RDD,先后顺序与结果无关。

创建两个RDD,其中有相同的元素,通过intersection()方法求出两个RDD的交集。

 subtract()方法

subtract()方法用于将前一个RDD中在后一个RDD出现的元素删除,可以认为是求补集的操作,返回值为前一个RDD去除与后一个RDD相同元素后的剩余值所组成的新的RDD。两个RDD的顺序会影响结果。

创建两个RDD,分别为rdd1rdd2,包含相同元素和不同元素,通过subtract()方法求rdd1rdd2彼此的补集。

cartesian()方法

cartesian()方法可将两个集合的元素两两组合成一组,即求笛卡儿积。

创建两个RDD,分别有4个元素,通过cartesian()方法求两个RDD的笛卡儿积。

 使用键值对RDDkeysvalues方法

键值对 RDD ,包含键和值两个部分。
Spark提供了两种方法,分别获取键值对RDD 的键和值。
        • keys 方法返回一个仅包含键的 RDD
        • values 方法返回一个仅包含值的 RDD

使用键值对RDDreduceByKey()方法

当数据集以键值对形式展现时,合并统计键相同的值是很常用的操作。

reduceByKey()方法用于合并具有相同键的值,作用对象是键值对,并且只对每个键的值进行处理,当RDD中有多个键相同的键值对时,则会对每个键对应的值进行处理。

reduceByKey()方法需要接收一个输入函数,键值对RDD相同键的值会根据函数进行合并并且创建一个新的RDD作为返回结果。

在进行处理时,reduceByKey()方法将相同键的前两个值传给输入函数,产生一个新的返回值,新产生的返回值与RDD中相同键的下一个值组成两个元素,再传给输入函数,直到最后每个键只有一个对应的值为止。reduceByKey()方法不是一种行动操作,而是一种转换操作。

使用键值对RDDgroupByKey()方法

groupByKey()方法用于对具有相同键的值进行分组,可以对同一组的数据进行计数、求和等操作。

对于一个由类型K的键和类型V的值组成的RDD,通过groupByKey()方法得到的RDD类型是[K,Iterable[V]]

1. parallelize()

parallelize()方法有两个输入参数,说明如下。

要转化的集合,必须是 Seq 集合。 Seq 表示序列,指的是一类具有一定长度的、可迭代访问的对象,其中每个数据元素均带有一个从 0 开始的、固定的索引。
分区数。若不设分区数,则 RDD 的分区数默认为该程序分配到的资源的 CPU 核心数。

 

​​​​​​​​​​​​​​2makeRDD()

makeRDD()方法有两种使用方式。

第一种方式的使用与 parallelize() 方法一致;
第二种方式是通过接收一个是 Seq[( T,Seq [String])] 参数类型创建 RDD

第二种方式生成的RDD中保存的是T的值,Seq[String]部分的数据会按照Seq[(T,Seq[String])]的顺序存放到各个分区中,一个Seq[String]对应存放至一个分区,并为数据提供位置信息,通过preferredLocations()方法可以根据位置信息查看每一个分区的值。调用makeRDD()时不可以直接指定RDD的分区个数,分区的个数与Seq[String]参数的个数是保持一致的。

 从外部存储系统中读取数据创建RDD

从外部存储系统中读取数据创建RDD是指直接读取存放在文件系统中的数据文件创建RDD

从内存中读取数据创建RDD的方法常用于测试,从外部存储系统中读取数据创建RDD才是用于实践操作的常用方法。

从外部存储系统中读取数据创建RDD可以有很多种数据来源,可通过SparkContext对象的textFile()方法读取数据集,该方法支持多种类型的数据集,如目录、文本文件、压缩文件和通配符匹配的文件等,并且允许设定分区个数。

使用map()方法转换数据

map()方法是一种基础的RDD转换操作,可以对RDD中的每一个数据元素通过某种函数进行转换并返回新的RDD

map()方法是转换操作,不会立即进行计算。

转换操作是创建RDD的第二种方法,通过转换已有RDD生成新的RDD。因为RDD是一个不可变的集合,所以如果对RDD数据进行了某种转换,那么会生成一个新的RDD

使用sortBy()方法进行排序

sortBy()方法用于对标准RDD进行排序,有3个可输入参数,说明如下。

1 个参数是一个函数 f:(T) => K ,左边是要被排序对象中的每一个元素,右边返回的值是元素中要进行排序的值。
2 个参数是 ascending ,决定排序后 RDD 中的元素是升序的还是降序的,默认是 true ,即升序排序,如果需要降序排序那么需要将参数的值设置为 false
3 个参数是 numPartitions ,决定排序后的 RDD 的分区个数,默认排序后的分区个数和排序之前的分区个数相等,即 this.partitions.size

第一个参数是必须输入的,而后面的两个参数可以不输入。

​​​​​​​使用collect()方法查询数据

collect()方法是一种行动操作,可以将RDD中所有元素转换成数组并返回到Driver端,适用于返回处理后的少量数据。

因为需要从集群各个节点收集数据到本地,经过网络传输,并且加载到Driver内存中,所以如果数据量比较大,会给网络传输造成很大的压力。

因此,数据量较大时,尽量不使用collect()方法,否则可能导致Driver端出现内存溢出问题。​​​​​​​

collect()方法有以下两种操作方式。

collect :直接调用 collect 返回该 RDD 中的所有元素,返回类型是一个 Array[T] 数组。
collect[U: ClassTag ](f: PartialFunction [T, U]) RDD [U] 。这种方式需要提供一个标准的偏函数,将元素保存至一个 RDD 中。首先定义一个函数 one ,用于将 collect 方法得到的数组中数值为 1 的值替换为“ one” ,将其他值替换为“ other”

 使用flatMap()方法转换数据

flatMap()方法将函数参数应用于RDD之中的每一个元素,将返回的迭代器(如数组、列表等)中的所有元素构成新的RDD

使用flatMap()方法时先进行map(映射)再进行flat(扁平化)操作,数据会先经过跟map一样的操作,为每一条输入返回一个迭代器(可迭代的数据类型),然后将所得到的不同级别的迭代器中的元素全部当成同级别的元素,返回一个元素级别全部相同的RDD

这个转换操作通常用来切分单词。

使用take()方法查询某几个值

take(N)方法用于获取RDD的前N个元素,返回数据为数组。

take()collect()方法的原理相似,collect()方法用于获取全部数据,take()方法获取指定个数的数据。

获取RDD的前5个元素

 使用union()方法合并多个RDD

union()方法是一种转换操作,用于将两个RDD合并成一个,不进行去重操作,而且两个RDD中每个元素中的值的个数、数据类型需要保持一致。

使用union()方法合并两个RDD

​​​​​​​使用filter()方法进行过滤

filter()方法是一种转换操作,用于过滤RDD中的元素。

filter()方法需要一个参数,这个参数是一个用于过滤的函数,该函数的返回值为Boolean类型。

filter()方法将返回值为true的元素保留,将返回值为false的元素过滤掉,最后返回一个存储符合过滤条件的所有元素的新RDD

创建一个RDD,并且过滤掉每个元组第二个值小于等于1的元素。

 使用distinct()方法进行去重

distinct()方法是一种转换操作,用于RDD的数据去重,去除两个完全相同的元素,没有参数。

创建一个带有重复数据的RDD,并使用distinct()方法去重。

使用简单的集合操作

Spark中的集合操作常用方法(转换操作)

 intersection()方法

intersection()方法用于求出两个RDD的共同元素,即找出两个RDD的交集,参数是另一个RDD,先后顺序与结果无关。

创建两个RDD,其中有相同的元素,通过intersection()方法求出两个RDD的交集。

subtract()方法

subtract()方法用于将前一个RDD中在后一个RDD出现的元素删除,可以认为是求补集的操作,返回值为前一个RDD去除与后一个RDD相同元素后的剩余值所组成的新的RDD。两个RDD的顺序会影响结果。

创建两个RDD,分别为rdd1rdd2,包含相同元素和不同元素,通过subtract()方法求rdd1rdd2彼此的补集。

 cartesian()方法

cartesian()方法可将两个集合的元素两两组合成一组,即求笛卡儿积。

创建两个RDD,分别有4个元素,通过cartesian()方法求两个RDD的笛卡儿积。

​​​​​​​​​​​​​​

 创建键值对RDD

有很多种创建键值对RDD的方式,很多存储键值对的数据格式会在读取时直接返回由其键值对组成的PairRDD

当需要将一个普通的RDD转化为一个PairRDD时可以使用map函数来进行操作,传递的函数需要返回键值对。

 使用键值对RDDkeysvalues方法

键值对RDD,包含键和值两个部分。

Spark提供了两种方法,分别获取键值对RDD的键和值。

keys 方法返回一个仅包含键的 RDD
values 方法返回一个仅包含值的 RDD 。​​​​​​​

使用键值对RDDreduceByKey()方法 

当数据集以键值对形式展现时,合并统计键相同的值是很常用的操作。

reduceByKey()方法用于合并具有相同键的值,作用对象是键值对,并且只对每个键的值进行处理,当RDD中有多个键相同的键值对时,则会对每个键对应的值进行处理。

reduceByKey()方法需要接收一个输入函数,键值对RDD相同键的值会根据函数进行合并并且创建一个新的RDD作为返回结果。

当数据集以键值对形式展现时,合并统计键相同的值是很常用的操作。

reduceByKey()方法用于合并具有相同键的值,作用对象是键值对,并且只对每个键的值进行处理,当RDD中有多个键相同的键值对时,则会对每个键对应的值进行处理。

reduceByKey()方法需要接收一个输入函数,键值对RDD相同键的值会根据函数进行合并并且创建一个新的RDD作为返回结果。

 使用键值对RDDgroupByKey()方法

groupByKey()方法用于对具有相同键的值进行分组,可以对同一组的数据进行计数、求和等操作。

对于一个由类型K的键和类型V的值组成的RDD,通过groupByKey()方法得到的RDD类型是[K,Iterable[V]]

​​​​​​​使用join()方法连接两个RDD

将有键的一组数据与另一组有键的数据根据键进行连接,是对键值对数据常用的操作之一。

与合并不同,连接会对键相同的值进行合并,连接方式多种多样,包含内连接、右外连接、左外连接、全外连接,不同的连接方式需要使用不同的连接方法。

连接方法如下表。

​​​​​​​

(1join()方法

join()方法用于根据键对两个RDD进行内连接,将两个RDD中键相同的数据的值存放在一个元组中,最后只返回两个RDD中都存在的键的连接结果。

例如,在两个RDD中分别有键值对(K,V)(K,W),通过join()方法连接会返回(K,(V,W))

创建两个RDD,含有相同键和不同的键,通过join()方法进行内连接。

(2rightOuterJoin()方法

rightOuterJoin()方法用于根据键对两个RDD进行右外连接,连接结果是右边RDD的所有键的连接结果,不管这些键在左边RDD中是否存在。

rightOuterJoin()方法中,如果在左边RDD中有对应的键,那么连接结果中值显示为Some类型值;如果没有,那么显示为None值。

(3leftOuterJoin()方法

leftOuterJoin()方法用于根据键对两个RDD进行左外连接,与rightOuterJoin()方法相反,返回结果保留左边RDD的所有键。

(4)fullOuterJoin()方法

fullOuterJoin()方法用于对两个RDD进行全外连接,保留两个RDD中所有键的连接结果。

 查看DataFrame数据

查看及获取数据的常用函数或方法

方法

描述

printSchema

打印数据模式

show

查看数据

first/head/take/takeAsList

获取若干行数据

collect/collectAsList

获取所有数据

将movies.dat电影数据上传至HDFS中,加载数据为RDD并将其转换为DataFrame.

1. printSchema:输出数据模式

printSchema函数查看数据模式,打印出列的名称和类型​​​​​​​

​​​​​​​

2. show():查看数据 

show()方法与show(true)方法一样,只显示前20条记录并且最多只显示20个字符

若是要显示所有字符,需要使用show(false)方法

​​​​​​​

show(numRows:Int)查看前n行记录

 3first()/head()/take()/takeAsList():获取若干条记录

​​​​​​​

4collect()/collectAsList():获取所有数据

collect方法可以将DataFrame中的所有数据都获取到,并返回一个数组。

collectAsList方法可以获取所有数据,返回一个列表。

DataFrame注册成为临时表,然后通过SQL语句进行查询

直接在DataFrame对象上进行查询,DataFrame提供了很多查询的方法

​​​​​​​

​​​​​​​1where()/filter()方法

1where()方法

DataFrame可以使用where(conditionExpr: String)根据指定条件进行查询

参数中可以使用andor

该方法的返回结果仍然为DataFrame类型

​​​​​​​

2filter()方法

DataFrame还可使用filter筛选符合条件的数据

2select()/selectExpr()/col()/apply()方法

1select()方法:获取指定字段值

select方法根据传入的string类型字段名,获取指定字段的值,以DataFrame类型返回

2selectExpr()方法:对指定字段进行特殊处理

selectExpr:对指定字段进行特殊处理可以对指定字段调用UDF函数或者指定别名

selectExpr传入String类型的参数,返回DataFrame对象。

3col()/apply()方法

col或者apply也可以获取DataFrame指定字段

col或者apply只能获取一个字段,并且返回对象为Column类型

​​​​​​​

首先简述了Spark SQL的基本概念,并且讲解了如何配置Spark SQL以及Spark SQLShell交互。

接着详细介绍了Spark SQL的核心抽象编程模型DataFrame及其基础操作,包括创建DataFrame对象、DataFrame的查询操作和输出操作。

最后使用Spark SQL对房屋售价数据进行探索分析,以此加深读者对Spark SQL的理解及操作。

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

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

相关文章

【Python技术】使用akshare、pandas高效复盘每日涨停板行业分析

作为一个程序员宝爸,每天的时间很宝贵,工作之余除了辅导孩子作业,就是补充睡眠。 怎么快速高效的进行当天A股涨停板的复盘,便于第二天的跟踪。这里简单写个示例, 获取当天连涨数排序,以及所属行业排序。 …

详解依赖注入的三种方法以及遇到问题的解决

各位大佬光临寒舍,希望各位能赏脸给个三连,谢谢各位大佬了!!! 目录 1.三种依赖注入的方法 1.属性注入 优点 缺点 2.构造方法注入 优点 缺点 3.Setter注入 优点 缺点 4.小结 2.依赖注入常见问题的解决 1…

人工智能中的概率魔法:解锁不确定性的智慧之钥

在人工智能(AI)的广阔天地中,概率论以其独特的魅力,成为了连接现实世界与智能决策的桥梁。从语音识别到图像识别,从自然语言处理到机器翻译,从智能推荐到自动驾驶,概率论知识在这些领域中发挥着…

ONVIF系列三:ONVIF客户端实现

ONVIF系列: ONVIF系列一:ONVIF介绍 ONVIF系列二:Ubuntu安装gSOAP、生成ONVIF代码框架 ONVIF系列三:ONVIF客户端实现 在系列二中完成了在Ubuntu上安装gSOAP并生成ONVIF代码框架,接下来我们利用生成的框架实现ONVIF客户端…

Spring框架核心:揭秘Java厨房的智能烹饪艺术

前情回顾:Spring框架深度解析:打造你的Java应用梦工厂 六. 实现控制反转 6.1 描述如何在Spring中实现IoC 在Spring Town的厨房里,实现控制反转就像是将食材的采购和准备过程外包给了一个智能系统。这个系统知道每种食材的特性,也…

质量保障之精准测试!

一、背景与概念 随着软件测试行业的长足发展,测试理念、技术都在发生着日新月异的变化。因此一套完整的自动化测试用例对于每个软件公司都是不可或缺的,然而虽然有如此规模宏大的自动化案例集资源投入,同时也有大量人力的投入,但…

深入理解Python的类,实例和type函数

问题起源: class t():pass s1 t() s2 type("Student2",(),{}) isinstance(s1, type), isinstance(s2, type)为什么第一个是false,第二个是true呢 根因定位: 在Python中,一切皆对象,类是对象&#xff0c…

AI+新能源充电桩数据集

需要的同学私信联系,推荐关注上面图片右下角的订阅号平台 自取下载。 随着我国新能源汽车市场的蓬勃发展,充电桩的需求量日益增加,充电桩的智能化程度不仅影响充电站运营商的经营效益,也大大影响着用户的充电体验。AI技术可以涵盖…

STK12 RPO模块学习 (1)

一、背景介绍 在STK12中,在Astrogator的模块上开发了新的模块(Rendezvous and proximity operations)。轨道交会接近通常来说是一个很复杂的过程。RPO实现需要对轨道动力学有一个清晰的理解,并且对于Astrogator模块具备很强的背景和经验&…

AI翻唱+视频剪辑全流程实战

目录 一、AI翻唱之模型训练 (1)模型部署 (2)数据集制作——搜集素材 (3)数据集制作——提升音频质量 方法一:使用RVC提供的音频处理功能。 方法二:可以使用音频剪辑工具Ad…

【软设】常见易错题汇总

目录 计算机系统基础 程序语言基础 数据结构 算法设计与分析 计算机网络与信息安全 软件工程基础 开发方法(结构化与面向对象) 数据库 操作系统 知识产权相关的法律法规 🤯🤯🤯🤯🤯&#x1f9…

基于Springboot的实习生管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的实习生管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&a…

APP反抓包 - 客户端证书验证进阶(代码混淆)

1.关于混淆 在安卓开发中,对于第三方的包是可以进行混淆的,例如:OKHttp3.Http.Cert.check 被混淆后可以是a.f.c.b 形式。在安卓开发中,系统包是无法混淆的,例如:java.security.KeyStore不会被混淆。由于这种的情况的存在,再次审示我们之前的通用脚本,就会发现他是不通用…

基于GD32的简易数字示波器(5)- 软件_控制LED

这期记录的是项目实战,做一个简易的数字示波器。 教程来源于嘉立创,帖子主要做学习记录,方便以后查看。 本期主要介绍GPIO口的输入输出模式,使用其中的输出模式驱动LED。详细教程可观看下方链接。 2.2 LED控制实验 语雀 1、LE…

synchronized 使用及实现原理

synchronized 关键字 如何使用 synchronized 关键字的使用方式主要有下面 3 种: 修饰实例方法 修饰静态方法 修饰代码块 1、修饰实例方法 (锁当前对象实例) 给当前对象实例加锁,进入同步代码前要获得 当前对象实例的锁 。 …

ViewModel 完全指南:实践与背后原理全解

一、引言 在现代Android应用开发中,处理UI数据的有效管理和状态保持是开发者面临的重要挑战之一。Google推出的Jetpack组件库中的ViewModel已成为解决这些问题的关键工具。ViewModel旨在以生命周期意识的方式存储和管理界面相关的数据,从而使数据在配置…

暴力法解决最近对问题和凸包问题-实现可视化

目录 最近对问题 凸包问题 最近对问题 顾名思义就是采用蛮力法求出所有点之间的距离,然后进行比较找出第一个最近对,一个一个进行比较。 大概思路就是如图(每个圈代表一个数对) 第一个和其他四个比较 第二个和其他三个比较 …

C++类和对象下——实现日期类

前言 在学习了类和对象的六大成员函数后,为了巩固我们学习的知识可以手写一个日期类来帮助我们理解类和对象,加深对于其的了解。 默认函数 构造函数 既然是写类和对象,我们首先就要定义一个类,然后根据实际需要来加入类的数据与函…

计算机Java项目|Springboot房产销售系统

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简…

Windows下安装Node.js、npm和electronic,并运行一个Hello, World!脚本程序

20240510 By wdhuag 目录 简介: 参考: 安装Node.js 安装npm 配置npm: 修改包存放目录和缓存目录 切换镜像源 使用 nrm 切换镜像源 安装Electron 运行一个Hello, World!脚本程序 安装Yarn JavaScript 指南 简介: Nod…