spark——RDD算子集合
目录
- 算子
- 转换算子示例
- map
- flatMap
- ReduceByKey
- filter
- distinct
- glom
- groupBy
- groupByKey
- SortBy
- sortByKey
- union
- 交集intersection和差集subtract
- join
- partitionBy
- mapPartition
- sample
- 行动算子示例
- ForeachPartition
- Foreach
- SaveAsTextFile
- CountByKey
- Reduce
- fold
- first、take、count
- top、takeOrderd
- takeSample
算子
描述
分布式集合RDD对象的方法被称为算子
类别 | 定义 | 特点 | 作用 |
---|---|---|---|
转换算子 | 返回值仍然是一个 RDD 的算子 | 懒加载,遇到 Action 算子前不执行 | 构建执行计划 |
(例如:map , filter , flatMap , reduceByKey ) | - 不会立即触发计算 - 形成 RDD 的 lineage | - 描述数据如何从一个 RDD 转换为另一个 RDD - 延迟计算 | |
行动算子 | 返回值不是 RDD 的算子 | 立即执行 | 让由转换算子构建好的执行计划开启工作 |
(例如:collect , count , reduce , take ) | - 触发计算 - 执行并返回结果到驱动程序或外部 | - 执行计算并返回结果 - 触发整个 RDD lineage 的计算 |
转换算子是对RDD进行一些格式等方面的操作,使得RDD满足行动算子的要求,行动算子是对RDD的计算操作
转换算子示例
map
将RDD中的数据一条一条处理,处理逻辑基于map算子接收到的函数,返回值为处理后的RDD
package com.wunaiieq.RDD
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object TransformationMap {def main(args: Array[String]): Unit = {val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("map")val sparkContext = new SparkContext(conf)//1.创建rdd对象val rdd: RDD[Int] = sparkContext.parallelize(List(1, 2, 3, 4))//2.定义函数,作为map算子的传入函数def funcA(x:Int):Int={if((x%2!=0)){return x*2}else{return x}}//3.map中使用funcAval rdd1: RDD[Int] = rdd.map(funcA)println(rdd1.collect().mkString(","))//4.匿名函数的用法def funcB(x:Int): Int ={return x*2}val rdd2: RDD[Int] = rdd.map(funcB)println(rdd2.collect().mkString(","))//关闭scsparkContext.stop()}
}
flatMap
将集合中的每一个元素按照空格进行拆分,拆分后的内容逐一作为一个元素组成一个新的RDD
package com.wunaiieq.RDD//1.导入spark下的SparkConf, SparkContext
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object TransformationFlatMap {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序的名称val conf = new SparkConf().setMaster("local[*]").setAppName("flagMap")//3.通过SparkConf对象构建SparkContext对象val sparkContext = new SparkContext(conf)//4.创建一个RDD对象val rdd1: RDD[String] = sparkContext.parallelize(List("a b c", "a a d", "b c d"))//5.将集合中的每一个元素按照空格进行拆分,拆分后的内容逐一作为一个元素组成一个新的RDDval rdd2: RDD[String] = rdd1.flatMap(line=>line.split(" "))print(rdd2.collect().mkString(","))sparkContext.stop()}
}
ReduceByKey
仅适用于Key-Value类型的RDD,自动按照key进行分组,然后根据提供的函数func的逻辑进行聚合操作,完成组内所有value的聚合操作。
package com.wunaiieq.RDDimport org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object RddReduceByKey {def main(args: Array[String]): Unit = {val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("reduceByKey")val sparkContext = new SparkContext(conf)//1.创建一个Key-Value类型的RDD对象val rdd: RDD[(String, Int)] = sparkContext.parallelize(List(("a", 1), ("a", 2), ("b", 1), ("a", 3), ("b", 1), ("a", 4)))//2.将相同的key的value做聚合加操作val rdd1: RDD[(String, Int)] = rdd.reduceByKey((x, y) => x + y)println(rdd1.collect().mkString(","))sparkContext.stop()}
}
filter
设置过滤函数,将RDD种符合条件的元素抽取并组成新的RDD(1234,抽取偶数,结果为24)
package com.wunaiieq.RDD//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object RddFilter {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("filter")//3.使用conf对象构建SparkContext对象val sparkContext = new SparkContext(conf)//5.创建Rddval rdd: RDD[Int] = sparkContext.parallelize(List(1, 2, 3, 4, 5, 8))//6.调用fiter算子,过滤掉奇数(x%2==0 false)//只保留偶数(x%2==0 true)val resultRdd: RDD[Int] = rdd.filter(x => x % 2 == 0)//7.输出println(resultRdd.collect().mkString(","))//4.关闭sparkContext对象sparkContext.stop()}
}
distinct
过滤重复值,重复值保留一个
package com.wunaiieq.RDD
//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object RddDistinct {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("filter")//3.使用conf对象构建SparkContet对象val sparkContext = new SparkContext(conf)//5.创建Rddval rdd: RDD[Int] = sparkContext.parallelize(List(1, 2, 3, 2, 5, 2))//6.去重后输出 : 1,2,3,5println(rdd.distinct().collect().mkString(","))//7.key-value型的rdd,如何认定为重复元素?只有key和value的值都相同时认定为重复元素//结果(y,1),(x,1),(x,2)val rdd1: RDD[(Char, Int)] = sparkContext.parallelize(List(('x', 1), ('x', 2), ('x', 1), ('y', 1)))println(rdd1.distinct().collect().mkString(","))//4.关闭sc对象sparkContext.stop()}
}
glom
给RDD增加一个关于分区的嵌套,显示分区效果,对于结果没有太多影响
package com.wunaiieq.RDD//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object RddGlom {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("glom")//3.使用conf对象构建SparkContet对象val sparkContext = new SparkContext(conf)//5.创建Rddval rdd1: RDD[Int] = sparkContext.parallelize(Array(1, 2, 3, 4, 5, 6), 2)//6.rdd1.glom()将rdd的数据加上一个嵌套,这个嵌套是按照分区进行的// rdd1: RDD[Int] 和 rdd2: RDD[Array[Int]] 类型不同val rdd2: RDD[Array[Int]] = rdd1.glom()//7.rddc1: Array[Int]和rddc2: Array[Array[Int]]类型也不一样val rddc1: Array[Int] = rdd1.collect()val rddc2: Array[Array[Int]] = rdd2.collect()println(rddc1.mkString(","))//println(rddc2.mkString(","))rddc2.foreach(arr=>println(arr.mkString(",")))//4.关闭sparkContext对象sparkContext.stop()}
}
groupBy
将输入的RDD进行分组,传入函数为分组要求,比如根据列表种第一个元素,使得所有相同的元素为一组
package com.wunaiieq.RDD//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object RddGroupBy {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("groupBy")//3.使用conf对象构建SparkContet对象val sparkContext = new SparkContext(conf)//5.创建Rddval rdd: RDD[(Char, Int)] = sparkContext.parallelize(Array(('a', 1), ('c', 1), ('a', 2), ('b', 1), ('b', 2), ('a', 3), ('a', 4)))//6.通过groupBy算子对rdd对象中的数据进行分组//groupBy插入的函数的用意是指定按照谁进行分组val gbRdd: RDD[(Char, Iterable[(Char, Int)])] = rdd.groupBy(tupEle => tupEle._1)//收集到Driver端val result1: Array[(Char, Iterable[(Char, Int)])] = gbRdd.collect()//(a,CompactBuffer((a,1), (a,2), (a,3), (a,4))),(b,CompactBuffer((b,1), (b,2)))println(result1.mkString(","))//7.使用map转换算子//(a,List((a,1), (a,2), (a,3), (a,4))),(b,List((b,1), (b,2)))val result2: Array[(Char, List[(Char, Int)])] = gbRdd.map(tup => (tup._1, tup._2.toList)).collect()println(result2.mkString(","))//4.关闭sparkContext对象sparkContext.stop()}
}
groupByKey
针对kv型的RDD进行分组
package com.wunaiieq.RDD//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object RddGroupByKey {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("groupByKey")//3.使用conf对象构建SparkContet对象val sparkContext = new SparkContext(conf)//5.创建Key-Value型Rddval rdd: RDD[(Char, Int)] = sparkContext.parallelize(Array(('a', 1), ('c', 1),('c', 3),('a', 2), ('b', 1), ('b', 2), ('a', 3), ('a', 4)))//6.按照key进行分组,分组后的结果是有二元组组成的RDDval gbkRdd: RDD[(Char, Iterable[Int])] = rdd.groupByKey()val result1: Array[(Char, Iterable[Int])] = gbkRdd.collect()//(a,CompactBuffer(1, 2, 3, 4)),(b,CompactBuffer(1, 2))println(result1.mkString(","))//7.使用map转换算子,对value数据转为Listval result2: Array[(Char, List[Int])] = gbkRdd.map(tup => (tup._1, tup._2.toList)).collect()//(a,List(1, 2, 3, 4)),(b,List(1, 2))println(result2.mkString(","))//4.关闭sparkContext对象sparkContext.stop()}
}
SortBy
排序算子,对rdd按照元祖的第n个值进行排序
package com.wunaiieq.RDD//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object RddSortBy {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("groupByKey")//3.使用conf对象构建SparkContet对象val sparkContext = new SparkContext(conf)//5.创建Key-Value型Rddval rdd: RDD[(Char, Int)] = sparkContext.parallelize(List(('w', 2), ('h', 5), ('k', 9), ('m', 3),('a', 7),('p', 4), ('q', 1), ('n', 8), ('y', 6)))//6.使用sortBy对rdd按照元祖的第二个值进行排序/*f: (T) => K,指定按照第几个元素记进行排序ascending: Boolean = true,true表示升序,false表示降序,默认就是true升序numPartitions: Int = this.partitions.length排序的分区数,默认为rdd的分区数*/val result1: Array[Array[(Char, Int)]] = rdd.sortBy(tup => tup._2,ascending = true, numPartitions = 3).glom().collect()result1.foreach(arr=>println(arr.mkString(",")))//7.全局有序,排序后的分区数设置为1val result2: Array[(Char, Int)] = rdd.sortBy(tup => tup._2,ascending = true, numPartitions = 1).collect()println(result2.mkString(","))//8按照元祖的第一个元素进行降序排序val result3: Array[(Char, Int)] = rdd.sortBy(tup => tup._1,ascending = false, numPartitions = 1).collect()println(result3.mkString(","))//4.关闭sparkContext对象sparkContext.stop()}
}
sortByKey
默认按照key的升序进行排序,生成的RDD对象分区数和原RDD相同
package com.wunaiieq.RDD//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object RddSortByKey {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[1]").setAppName("sortByKey")//3.使用conf对象构建SparkContet对象val sparkContext = new SparkContext(conf)//5.创建Key-Value型Rddval rdd: RDD[(Char, Int)] = sparkContext.parallelize(List(('w', 2), ('h', 5), ('k', 9), ('m', 3),('a', 7),('p', 4), ('q', 1), ('n', 8), ('y', 6)))println("rdd partition num:"+rdd.getNumPartitions)//6.默认按照key的升序排列,生成的RDD对象分区数与原RDD相同。val rdd1: RDD[(Char, Int)] = rdd.sortByKey()println("rdd1 partition num:"+rdd1.getNumPartitions)val result1: Array[(Char, Int)] = rdd1.collect()println(result1.mkString(","))//7.按照key的降序排列,默认生成的RDD对象分区数与原RDD相同。val rdd2: RDD[(Char, Int)] = rdd.sortByKey(ascending = false)println("rdd2 partition num:"+rdd2.getNumPartitions)val result2: Array[(Char, Int)] = rdd2.collect()println(result2.mkString(","))//8.按照key的降序排列,设定生成的RDD对象分区数为4。val rdd3: RDD[(Char, Int)] = rdd.sortByKey(ascending = false, numPartitions = 4)println("rdd3 partition num:"+rdd3.getNumPartitions)val result3: Array[Array[(Char, Int)]] = rdd3.glom().collect()result3.foreach(arr=>println(arr.mkString(",")))//9.按照key的升序排序,生成的RDD的分区数设置为1,就实现了全局有序val result4: Array[(Char, Int)] = rdd.sortByKey(ascending = true, numPartitions = 1).collect()println(result4.mkString(","))//4.关闭sc对象sparkContext.stop()}
}
union
将两个同类型RDD进行合并,合并后的顺序为调用union算子的rdd在前,作为参数的rdd在后,rdd内部顺序不变
package com.wunaiieq.RDD//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object RddUnion {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[1]").setAppName("union")//3.使用conf对象构建SparkContet对象val sparkContext = new SparkContext(conf)//5.创建3个RDD对象val rdd1: RDD[Int] = sparkContext.parallelize(Array(1, 2, 3, 4))val rdd2: RDD[Int] = sparkContext.parallelize(Array(3, 4, 5, 6))val rdd3: RDD[String] = sparkContext.parallelize(Array("x", "y"))//6.union算子将两个rdd对象元素做并集计算,并生成一个新的rdd对象val result21: RDD[Int] = rdd2.union(rdd1)val result12: RDD[Int] = rdd1.union(rdd2)//7.union算子不会去重,无方向性println(result21.collect().mkString(","))println(result12.collect().mkString(","))//8.使用union做并集计算的两个rdd的数据类型要一致,否则出错//rdd1.union(rdd3)//4.关闭sc对象sparkContext.stop()}
}
交集intersection和差集subtract
交集:将两个RDD相同元素获取后组成新的RDD
差集:一个RDD去除和另一个RDD相同元素的剩余元素,组成的新的RDD
package com.wunaiieq.RDD//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object RddIntersectionSubtract {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[1]").setAppName("交集和差集")//3.使用conf对象构建SparkContet对象val sparkContext = new SparkContext(conf)//5.创建5个RDD对象val rdd1: RDD[Int] = sparkContext.parallelize(Array(1, 2, 3, 4))val rdd2: RDD[Int] = sparkContext.parallelize(Array(3, 4, 5, 6))val rdd3: RDD[(Char, Int)] = sparkContext.parallelize(List(('x', 6), ('y', 1)))val rdd4: RDD[(Char, Int)] = sparkContext.parallelize(List(('x', 6), ('z', 3)))val rdd5: RDD[(Char, Int)] = sparkContext.parallelize(List(('x', 5), ('z', 3)))//6.交集运算,将两个rdd中的相同元素获取后组成一个新的rdd,无方向性println(rdd1.intersection(rdd2).collect().mkString(","))println(rdd2.intersection(rdd1).collect().mkString(","))val rdd34: RDD[(Char, Int)] = rdd3.intersection(rdd4)val rdd43: RDD[(Char, Int)] = rdd4.intersection(rdd3)println(rdd34.collect().mkString(","))println(rdd43.collect().mkString(","))//如果是二元组,key和value都相同,才认定为同一个元素println(rdd4.intersection(rdd5).collect().mkString(","))//7.差集,有方向性的println(rdd1.subtract(rdd2).collect().mkString(","))println(rdd2.subtract(rdd1).collect().mkString(","))println(rdd3.subtract(rdd4).collect().mkString(","))println(rdd4.subtract(rdd3).collect().mkString(","))//扩展:只比较keyprintln("-------------------")println(rdd4.subtract(rdd5).collect().mkString(","))//由于只比较key,所以rdd4和rdd5的key均为x,z因此差集为空println("=="+rdd4.subtractByKey(rdd5).collect().mkString(","))//4.关闭sc对象sparkContext.stop()}
}
join
只能使用kv类型的RDD,对相同的key进行匹配连接
package com.wunaiieq.RDD//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object RddJoin {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[1]").setAppName("关联查询")//3.使用conf对象构建SparkContet对象val sc = new SparkContext(conf)//5.创建两个rddval rdd1: RDD[(Int, String)] = sc.makeRDD(List((101, "A"), (102, "B"), (103, "C")))val rdd2: RDD[(Int, String)] = sc.makeRDD(List((101, "a"), (102, "b"), (104, "d"),(101, "aa")))//6.通过join关联算子 rdd1.join(rdd2) 关联条件是key,只保留关联上的数据val rdd1j2: RDD[(Int, (String, String))] = rdd1.join(rdd2)//结果:(101,(A,a)),(101,(A,aa)),(102,(B,b))println(rdd1j2.collect().mkString(","))//7.左外关联(101,(A,Some(a))),(101,(A,Some(aa))),(102,(B,Some(b))),(103,(C,None))val rdd1loj2: RDD[(Int, (String, Option[String]))] = rdd1.leftOuterJoin(rdd2)println(rdd1loj2.collect().mkString(","))//8.右外关联(101,(Some(A),a)),(101,(Some(A),aa)),(104,(None,d)),(102,(Some(B),b))val rdd1roj2: RDD[(Int, (Option[String], String))] = rdd1.rightOuterJoin(rdd2)println(rdd1roj2.collect().mkString(","))//(101,(a,Some(A))),(101,(aa,Some(A))),(104,(d,None)),(102,(b,Some(B)))println(rdd2.leftOuterJoin(rdd1).collect().mkString(","))//4.关闭sc对象sc.stop()}
}
partitionBy
对RDD进行重新分区
package com.wunaiieq.RDD//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{Partitioner, SparkConf, SparkContext}object RddPartitionBy {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[1]").setAppName("partitionBy")//3.使用conf对象构建SparkContet对象val sc = new SparkContext(conf)//5.创建1个RDD对象val rdd: RDD[(String, Int)] = sc.parallelize(List(("andy", 1), ("jack", 1),("hello", 1), ("lucy", 1), ("tom", 1), ("su", 1)))println("重新自定义分区前:"+rdd.getNumPartitions)//6.调用partitionBy()对rdd对象进行重新分区val rdd1: RDD[(String, Int)] = rdd.partitionBy(new Partitioner {override def numPartitions = 3override def getPartition(key: Any): Int = {//获取key的首字母val firstChar: Char = key.toString.charAt(0)//['a','i] => 0if (firstChar >= 'a' && firstChar <= 'i') {return 0} else if (firstChar >= 'j' && firstChar <= 'q') {return 1} else {return 2}}})val result: Array[Array[(String, Int)]] = rdd1.glom().collect()//输出result.foreach(arr=>println(arr.mkString(",")))//4.关闭sc对象sc.stop()}
}
mapPartition
类似于map,作用是对每个分区进行操作
算子 | 数据处理方式 | 性能特性 | 适用场景 |
---|---|---|---|
map | 对RDD中的每一个元素进行操作 | 每个元素独立处理,通常性能稳定 | 需要对RDD中的每个元素执行简单转换或计算的场景 |
接受一个函数,应用于RDD的每个元素 | 内存使用较为安全,不易导致内存溢出问题 | 不依赖分区元数据或复杂计算的场景 | |
mapPartition | 对RDD中的每一个分区的迭代器进行操作 | 可能具有更好的性能,因为减少了函数调用的开销 | 需要对RDD中的每个分区执行复杂计算或转换的场景 |
接受一个函数,应用于RDD的每个分区 | 内存使用需谨慎,可能因处理大量数据而导致内存溢出 | 依赖分区元数据或需要减少资源创建次数的场景 |
package com.wunaiieq.RDD//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}import scala.collection.mutable.ListBufferobject RddMapPartition {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[1]").setAppName("mapPartition")//3.使用conf对象构建SparkContet对象val sc = new SparkContext(conf)//5.创建RDD对象val rdd: RDD[String] = sc.parallelize(List("a", "b", "c", "d", "e", "f"), 3)//6.自定义一个处理函数def process(datas: Iterator[String]): Iterator[String] = {println("创建数据库连接...")val result = ListBuffer[String]()//遍历datasfor(ele<-datas){result.append(ele)}println("批量插入数据:"+result)println("关闭数据库连接...")//返回result.iterator}//7.调用mapPartitions操作val resultRdd: RDD[String] = rdd.mapPartitions(process)resultRdd.count()//4.关闭sc对象sc.stop()}
}
sample
根据指定规则从RDD中抽取数据
参数名称 | 类型 | 描述 |
---|---|---|
withReplacement | Boolean | 是否允许放回抽样。true 表示允许元素被重复抽取,false 表示不允许。 |
fraction | Double | 抽取比例,表示希望从原始RDD中抽取的样本比例(0到1之间)。若withReplacement 为true ,则此值可理解为每个元素被期望抽取的次数。 |
seed | Long | 随机种子。若提供,则每次运行抽样操作会得到相同的结果;若不提供(或设置为None),则每次结果可能不同。 |
package com.wunaiieq.RDD//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
import scala.collection.mutable.ListBuffer
object RddSample {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[1]").setAppName("sample")//3.使用conf对象构建SparkContet对象val sc = new SparkContext(conf)//5.创建RDD对象val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4, 5, 6, 7, 9, 0), 1)val rdd2: RDD[Int] = rdd.sample(true, 2)println("2"+rdd2.collect().mkString(","))//当种子相同(前两个参数的值也相同)时,多次抽取的结果相同val rdd3: RDD[Int] = rdd.sample(false, 0.3, 6)val rdd4: RDD[Int] = rdd.sample(false, 0.3, 6)println(rdd3.collect().mkString(","))println(rdd4.collect().mkString(","))val rdd5: RDD[Int] = rdd.sample(true, 2, 3)val rdd6: RDD[Int] = rdd.sample(true, 2, 3)println(rdd5.collect().mkString(","))println(rdd6.collect().mkString(","))//4.关闭sc对象sc.stop()}
}
行动算子示例
ForeachPartition
在进行每个分区操作前后增加一些额外的操作
package com.wunaiieq.RDD.action//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
import scala.collection.mutable.ListBuffer
object RddForeachPartition {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[1]").setAppName("ForeachPartition")//3.使用conf对象构建SparkContet对象val sc = new SparkContext(conf)//5.创建RDD对象val rdd: RDD[String] = sc.parallelize(List("a", "b", "c", "e", "f", "d"), 3)//6.自定义处理函数def process(datas: Iterator[String]): Unit = {println("操作一-开始一个分区...")val result = ListBuffer[String]()for(data<-datas){result.append(data)}println("当前分区的数据:"+result)println("操作二-结束一个分区...")}//7.调用foreachPartition算子,参数为自定义函数rdd.foreachPartition(process)//4.关闭sc对象sc.stop()}
}
Foreach
对每个元素提供操作逻辑,无返回值
package com.wunaiieq.RDD.action//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}import scala.collection.mutable.ListBuffer
object RddForeach {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[1]").setAppName("foreach")//3.使用conf对象构建SparkContet对象val sc = new SparkContext(conf)//5.创建RDD对象val rdd: RDD[String] = sc.parallelize(List("a", "b", "c", "e", "f", "d"), 3)//6.自定义函数def process(ele:String): Unit ={println("开启process..")println("当前数据"+ele)println("结束process..")}//7.调用foreach算子,参数为自定义函数 f: T => Unitrdd.foreach(process)println("------------------")//8.可以为foreach算子指定print\println函数//rdd.foreach(print)rdd.foreach(println)//4.关闭sc对象sc.stop()}
}
SaveAsTextFile
将RDD数据写入到txt文本文件中,支持本地文件、hdfs等,RDD的每个分区均会产生一个结果文件
package com.wunaiieq.RDD.action//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object RddSaveAsTextFile {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[1]").setAppName("SaveAsTextFile")//3.使用conf对象构建SparkContet对象val sc = new SparkContext(conf)//5.创建RDD对象val rdd: RDD[String] = sc.parallelize(List("a", "b", "c", "e", "f", "d"), 3)//6.将rdd中的数据保持到本地磁盘rdd.saveAsTextFile("data/output/file")
// 7.将数据写入到HDFS文件系统中 node1上namenode需要是active
// rdd.saveAsTextFile("hdfs://node1:9820/spark/output/file")
// 8.为了避免active namenode放生变化,所以最好使用mycluster
// UnknownHostException: mycluster 需要将虚拟机中的core-site.xml和hdfs-site.xml文件下载到本项目的resources目录下
// rdd.saveAsTextFile("hdfs://mycluster/spark/output/file")//4.关闭sc对象sc.stop()}
}
CountByKey
统计kv型RDD中,key出现的次数
转换算子reduceByKey是对RDD做聚合操作,针对相同key的value还会进行相加
package com.wunaiieq.RDD.action//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object RddCountByKey {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[1]").setAppName("foreach")//3.使用conf对象构建SparkContet对象val sc = new SparkContext(conf)//5.创建KeyValue型RDD对象val rdd: RDD[(String, Int)] = sc.parallelize(List(("a", 1), ("b", 1), ("a", 2), ("b", 2), ("a", 3), ("a", 4)))//6.复习转换算子reduceByKey:将相同key的value值做聚合操作val rdd2: RDD[(String, Int)] = rdd.reduceByKey(_ + _)println(rdd2.collect().mkString(","))//7.行动算子countByKey 表示统计key出现次数val result: collection.Map[String, Long] = rdd.countByKey()result.foreach(println)//4.关闭sc对象sc.stop()}
}
Reduce
对传入的RDD做聚合操作(一般为相加)
package com.wunaiieq.RDD.action//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object RddReduce {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[1]").setAppName("reduce")//3.使用conf对象构建SparkContet对象val sc = new SparkContext(conf)//5.创建RDD对象val rdd: RDD[Int] = sc.parallelize(List(1, 2, 3, 4))//6.将rdd中所有元素做聚合加操作val sum: Int = rdd.reduce(_ + _)println(sum)//4.关闭sc对象sc.stop()}
}
fold
此方法也是聚合操作,不过会携带一个初始值,在每个分区进行聚合操作时,会带上初始值一起进行
分区1:10(初始值)+1+2+3(123为分区内数据)=16
分区2:10+4+5+6=25
分区3:10+7+8+9=34
分区聚合:10(初始值)+16(分区1)+25(分区2)+34(分区3)=85
package com.wunaiieq.RDD.action//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object RddFold {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[1]").setAppName("fold")//3.使用conf对象构建SparkContet对象val sc = new SparkContext(conf)//5.创建RDD对象//val rdd: RDD[Int] = sc.parallelize(List(1, 2, 3, 4, 5, 6, 7, 8, 9), 1)val rdd: RDD[Int] = sc.parallelize(List(1, 2, 3, 4, 5, 6, 7, 8, 9), 3)//6.执行带有初始值的fold聚合操作//10表示初始值,_+_表示做聚合加操作//RDD对象中所有元素的和+(partitionNum+1)*10val result: Int = rdd.fold(10)(_ + _)//7.注意:初始值的类型要和RDD中数据的类型一致//rdd.fold(10.5)(_+_)//错误的println(result)//4.关闭sc对象sc.stop()}
}
first、take、count
first:取出RDD第一个元素
take:取出RDD的前n个元素
count:统计RDD的元素数量
RDD的分区是只存储位置的不同,因此对于结果的顺序是没影响的,但是不同分区的元素数量会影响take的性能
比如第一个分区上1个元素,第二个2个,第三个3个,现在执行take(5)它需要先从第一个分区上读取,然后第二个,第三个,影响效率
package com.wunaiieq.RDD.action//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object RddFirstTakeCount {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[1]").setAppName("FirstTakeCount")//3.使用conf对象构建SparkContet对象val sc = new SparkContext(conf)//5.创建RDD对象,这里是否分区没区别val rdd: RDD[Int] = sc.parallelize(List(5, 2, 1, 4, 3, 8, 6, 1))//6.获取第一个元素val first: Int = rdd.first()println("first:"+first)//7.获取rdd前三个元素val threeEle: Array[Int] = rdd.take(3)println(threeEle.mkString(","))//8.获取rdd中元素的总数val eleNum: Long = rdd.count()println(eleNum)//4.关闭sc对象sc.stop()}
}
top、takeOrderd
top算子:
top(n)取出RDD降序排序后的topN
top(n)(Ordering.Int.reverse)取出RDD升序后的topN
takeOrdered算子:
takeOrdered(n)取出RDD升序排序后的topN
takeOrdered(n)(Ordering.Int.reverse)取出RDD降序排序后的topN
简单来讲就是top和takeOrdered用于获取排序的最开始n位,默认排序位降序、升序,同时可以增加其他自定义的函数
package com.wunaiieq.RDD.action//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object RddTopTakeOrdered {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[1]").setAppName("TakeOrdered")//3.使用conf对象构建SparkContet对象val sc = new SparkContext(conf)//5.创建RDD对象val rdd: RDD[Int] = sc.parallelize(List(5, 2, 1, 4, 3, 8, 6, 1))//6.获取默认降序的top3val top3: Array[Int] = rdd.top(3)println("top3:"+top3.mkString(","))//7.获取默认升序的top3val takeOr3: Array[Int] = rdd.takeOrdered(3)println("takeOr3:"+takeOr3.mkString(","))//8.获取升序的top3val top3r: Array[Int] = rdd.top(3)(Ordering.Int.reverse)println("top3r:"+top3r.mkString(","))//9.获取降序的top3val takeOr3r: Array[Int] = rdd.takeOrdered(3)(Ordering.Int.reverse)println("takeOr3r:"+takeOr3r.mkString(","))//4.关闭sc对象sc.stop()}
}
takeSample
//withReplacement:true可以重复,false:不能重复。数据位置是否重复不是值
//num:抽样的元素个数
//seed:随机种子,数值型的;RDD元素相同的情况下,相同的种子抽样出的元素也相同
def takeSample(withReplacement: Boolean,num: Int,seed: Long = Utils.random.nextLong): Array[T]
)
方法 | 使用场景 | 返回类型 | 采样方式 | 参数设置 |
---|---|---|---|---|
takeSample 行动算子 | 从 RDD 中随机抽取指定数量的样本 | 数组 | 按设定的采样个数 | withReplacement (是否允许重复采样,布尔值)num (要抽取的样本数量,整数)seed (随机算法的种子值,可选) |
sample 转换算子 | 从 RDD 中随机抽取按比例分布的样本 | 新的 RDD | 按指定的比例 | withReplacement (是否允许重复采样,布尔值)fraction (要抽取的样本比例,0 到 1 之间的浮点数)seed (随机算法的种子值,可选) |
package com.wunaiieq.RDD.action//1.导入类
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object RddTakeSample {def main(args: Array[String]): Unit = {//2.构建SparkConf对象,并设置本地运行和程序名称val conf: SparkConf = new SparkConf().setMaster("local[1]").setAppName("TakeSample")//3.使用conf对象构建SparkContet对象val sc = new SparkContext(conf)//5.创建RDD对象val rdd: RDD[Int] = sc.parallelize(List(5, 2, 1, 4, 3, 8, 6, 1))//6.第一个参数为true表示被抽出的元素返回,所以抽样的元素个数可以超过rdd.count() 元素个数val result: Array[Int] = rdd.takeSample(true, 10, 2)println(result.mkString(","))//7.第一个参数为false表示被抽取出的数据不放回,如果数量>rdd.count()println(rdd.takeSample(false,10,2).mkString(","))//8.三个参数的值都一样时,多次抽取结果println(rdd.takeSample(false,5,3).mkString(","))println(rdd.takeSample(false,5,3).mkString(","))//4.关闭sc对象sc.stop()}
}
相关文章:
spark——RDD算子集合
目录 算子转换算子示例mapflatMapReduceByKeyfilterdistinctglomgroupBygroupByKeySortBysortByKeyunion交集intersection和差集subtractjoinpartitionBymapPartitionsample 行动算子示例ForeachPartitionForeachSaveAsTextFileCountByKeyReducefoldfirst、take、counttop、tak…...
【ArcGIS Pro二次开发实例教程】(1):图层的前置、后置
一、简介 此工具要实现的功能是:将内容框中当前选定的图层移到最顶层或最底层。 主要技术要点包括: 1、Config.daml文件设置(UI设置) 2、按钮的图片和位置设置 3、当前选定图层的获取 4、图层在内容列表中位置的获取和移动 …...
idea 运行 docker-compose 文件问题
我idea 连接远程docker 然后本地运行compose 文件出了问题 C:\Program Files\Docker\Docker\resources\bin\docker.exe compose -f D:\aproject\group-buy-market\suger_group_buy\docs\dev-ops\docker-compose-environment.yml -p dev-ops up -d正在准备 Docker SSH 环境…ti…...
深度学习中的正则化方法
最近看到了正则化的内容,发现自己对正则化的理解已经忘得差不多了,这里在整理一下,方便以后查阅。 深度学习中的正则化方法 1. L2 正则化(L2 Regularization)2. L1 正则化(L1 Regularization)3.…...
LInux单机安装Redis
1. 安装gee工具包 由于Redis是基于c语言编写的所以安装的时候需要先安装gee以及gcc的依赖,yum云用不了可以看一下这个 linux 替换yum源镜像_更换yum镜像源-CSDN博客 yum install -y gcc tcl 2. 添加redis的压缩包 3. 上传到Linux 上传到 /usr/local/src 目录、这个目录一般用于…...
kafka使用以及基于zookeeper集群搭建集群环境
一、环境介绍 zookeeper下载地址:https://zookeeper.apache.org/releases.html kafka下载地址:https://kafka.apache.org/downloads 192.168.142.129 apache-zookeeper-3.8.4-bin.tar.gz kafka_2.13-3.6.0.tgz 192.168.142.130 apache-zookee…...
深入理解 pytest_runtest_makereport:如何在 pytest 中自定义测试报告
pytest_runtest_makereport 是 pytest 系统中的一个钩子函数,它允许我们在测试执行时获取测试的报告信息。通过这个钩子,我们可以在测试运行时(无论是成功、失败还是跳过)对测试结果进一步处理,比如记录日志、添加自定…...
嵌入式技术之Linux(Ubuntu) 一
一、Linux入门 1.硬件和操作系统以及用户的关系 一个传感器,获得数据后,需要向服务器发送数据。传感器传数据给上位机。 上位机需要一个程序来接收数据,那么这个上位机是什么机器? 我们的笔记本电脑就可以当成上位机。 两个手…...
VB.NET CRC32 校验
在 VB.NET 中实现 CRC32 校验并在校验失败时退出程序,你可以按照以下步骤进行: 实现 CRC32 计算函数:首先,你需要一个函数来计算给定数据的 CRC32 值。 比较计算的 CRC32 值:然后,你需要将计算出的…...
iOS - 弱引用表(Weak Reference Table)
1. 基本数据结构 // 弱引用表的基本结构 struct weak_table_t {weak_entry_t *weak_entries; // 保存所有的弱引用对象size_t num_entries; // 当前存储的弱引用数量uintptr_t mask; // 哈希表大小掩码uintptr_t max_hash_displacement; /…...
Taro地图组件和小程序定位
在 Taro 中使用腾讯地图 1.首先在项目配置文件 project.config.json 中添加权限: {"permission": {"scope.userLocation": {"desc": "你的位置信息将用于小程序位置接口的效果展示"}} }2.在 app.config.ts 中配置&#x…...
汇编实现函数调用
x86_64 通过将函数参数存放在栈中的方式来实现参数传递。 # PURPOSE: Program to illustrate how functions work # This program will compute the value of # 2^3 5^2 ## Everything in the main program is stored in registers, # so the data section…...
C#—Task异步的常用方法及TaskFactory工厂类详解
Task异步的常用方法 C# 中的 Task 类是 System.Threading.Tasks 命名空间的一部分,用于表示异步操作。 以下是一些常用的 Task 类方法: 一、Task.Run(Action action): 此静态方法用于在后台运行一个新任务,并返回与该任务关联的 Task 实例…...
JAVA | 通过自定义注解与AOP防止接口重复提交
关注:CodingTechWork 引言 在Web应用开发中,特别是在处理表单提交或API调用时,可能会遇到用户因网络延迟、按钮多次点击等原因导致的重复提交问题。为了解决这一问题,通常的做法是在前端禁用提交按钮,或者在后端使用唯…...
从零手写实现redis(四)添加监听器
1、删除监听器 /*** 删除监听器接口** author binbin.hou* since 0.0.6* param <K> key* param <V> value*/ public interface ICacheRemoveListener<K,V> {/*** 监听* param context 上下文* since 0.0.6*/void listen(final ICacheRemoveListenerContext&…...
Spring Boot项目中使用单一动态SQL方法可能带来的问题
1. 查询计划缓存的影响 深入分析 数据库系统通常会对常量SQL语句进行编译并缓存其执行计划以提高性能。对于动态生成的SQL语句,由于每次构建的SQL字符串可能不同,这会导致查询计划无法被有效利用,从而需要重新解析、优化和编译,…...
51单片机——中断(重点)
学习51单片机的重点及难点主要有中断、定时器、串口等内容,这部分内容一定要认真掌握,这部分没有学好就不能说学会了51单片机 1、中断系统 1.1 概念 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在&#…...
MySQL insert or update方式性能比较
MySQL中,有如下两种方式,哪种方式比较好? 1、先使用enterprise_id字段查询数据表,如果表中存在记录,则更新记录;如果不存在,则插入记录; 2、使用“INSERT INTO XXX ON DUPLICATE K…...
Linux下常用命令
本文以笔记的形式记录Linux下常用命令。 注1:限于研究水平,阐述难免不当,欢迎批评指正。 注2:文章内容会不定期更新。 一、Ubuntu 添加账号 useradd -m -s /bin/bash -d /home/newuser newuser:newuser passwd newuser 二、 Ce…...
计算机网络、嵌入式等常见问题简答
1.嵌入式系统中经常要用到无限循环,如何用C编写死循环 答:while(1){}或者for(;;) 2.程序的局部变量存在于哪里,全局变量存在于哪里,动态申请数据存在于哪里。 答:程序的局部变量存在于栈区;全局变量存在…...
嵌入式中QT实现文本与线程控制方法
第一:利用QT进行文件读写实现 利用QT进行读写文本的时候进行读写,读取MP3歌词的文本,对这个文件进行读写操作。 实例代码,利用Qfile,对文件进行读写。 //读取对应文件文件,头文件的实现。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #incl…...
141.环形链表 142.环形链表II
141.环形链表 & 142.环形链表II 141.环形链表 思路:快慢指针 or 哈希表 快慢指针代码: class Solution { public:bool hasCycle(ListNode *head) {if(headnullptr||head->nextnullptr)return false;ListNode *fasthead->next; //不能设置成…...
计算机网络掩码、最小地址、最大地址计算、IP地址个数
一、必备知识 1.无分类地址IPV4地址网络前缀主机号 2.每个IPV4地址由32位二进制数组成 3. /15这个地址表示网络前缀有15位,那么主机号32-1517位。 4.IP地址的个数:2**n (n表示主机号的位数) 5.可用(可分配)IP地址个数&#x…...
第3章——HTTP报文内的HTTP信息
第3章——HTTP报文内的HTTP信息 HTTP报文 用于HTTP协议交互的信息被称为HTTP报文,分为请求报文和响应报文。分为Head,Body 结构: 请求行:包含用于请求的方法,请求URI和HTTP版本。 状态行:包含表明响应…...
Minio-Linux-安装
文章目录 1.Linux安装1.下载源码包2.上传到/usr/local/minio1.进入目录2.上传 3.开放执行权限4.创建minio文件存储目录及日志目录5.编写启动的shell脚本1.脚本编写2.赋予执行权限 6.启动!1.执行run脚本2.查看日志3.开放9001和9000端口1.服务器2.安全组3.访问&#x…...
面试高阶问题:对称加密与非对称加密的原理及其应用场景
目录 第一章 对称加密原理及算法实现 第二章 非对称加密原理及算法实现 第三章 对称加密与非对称加密的应用场景 第四章 对称加密与非对称加密的应用实例 第五章 对称加密与非对称加密的对比分析 第一章 对称加密原理及算法实现 1.1 对称加密的原理 对称加密,又称私钥加密…...
报错 - decord 在 macOS Silicon 安装失败
问题:在 macOS M2 上 pip 安装 decord 出错: ERROR: Could not find a version that satisfies the requirement decord (from versions: none) ERROR: No matching distribution found for decord使用 decord 源码编译,make 也会出很多问题 …...
英伟达 RTX 5090 显卡赋能医疗大模型:变革、挑战与展望
一、英伟达 RTX 5090 与 RTX 4090 技术参数对比 1.1 核心架构与制程工艺 在探讨英伟达 RTX 4090 与 RTX 5090 的差异时,核心架构与制程工艺无疑是最为关键的基础要素,它们从根本上决定了两款显卡的性能上限与应用潜力。 1.1.1 核心架构差异 RTX 4090…...
PyCharm简单调试
本文简单讲述一下PyCharm中经常用到的调试操作。 示例代码如下: for i in range(10):print("hello", i)if i > 2:print("ok!")在代码前面打上断点,如下图所示: 单机调试按钮Debug 单机Resume Program按钮…...
快速入门Spring Cloud Alibaba,轻松玩转微服务
1 快速入门Spring Cloud Alibaba,轻松玩转微服务 1.1 架构 架构图: 1.2 项目结构 1.2.1 系统框架版本 版本适配查看:https://sca.aliyun.com/docs/2023/overview/version-explain/ Spring Boot Version :3.2.4 Spring Clo…...
浅尝Appium自动化框架
浅尝Appium自动化框架 Appium自动化框架介绍Appium原理Appium使用安装平台驱动 Appium自动化框架介绍 Appium 是一个开源的自动化测试框架,最初设计用于移动应用的测试,但现在它也扩展了对桌面端应用的支持。Appium 使得自动化测试变得更加简单…...
poi-tl+kkviewfile实现生成pdf业务报告
需求背景,需要把ai生成的一些业务数据,生成一份pdf报告 需求分析 简单来说,就是json生成pdf的方案。 直接生成pdf。适合一些pdf样式简单的场景,一般就是纯文本按序渲染,或者是纯表格。如果需要一些复杂的排布&#x…...
python导入模块失败
运行下面代码模块,出现报错,导入模块失败 import torch from layers.Embed import DataEmbedding from layers.Conv_Blocks import Inception_Block_V1 将你自己的目录添加到 sys.path,假设你的目录位置是D://winhzq//桌面//pydemo//…...
Vulkan 学习(12)---- Vulkan pipeline 创建
目录 Vulkan 渲染管线顶点输入阶段输入装配阶段顶点着色器阶段细分控制、评估着色器阶段(可选)几何着色器阶段(可选)图元装配阶段光栅化阶段片段着色器片段测试阶段混合阶段 Vulkan 渲染管线 渲染管线可以看作是一条生产流水线,定义了从输入顶点到输出图像的所有步…...
BloombergGPT: A Large Language Model for Finance——面向金融领域的大语言模型
这篇文章介绍了BloombergGPT,一个专门为金融领域设计的大语言模型(LLM)。以下是文章的主要内容总结: 背景与动机: 大语言模型(如GPT-3)在多个任务上表现出色,但尚未有针对金融领域的…...
来说数据库
什么是数据库? 是部署在操作系统上,把数据按一定的数据模型组织、永久存储,并可以被用户共享的软件系统。 其实数据库,可以理解为,把数据都存成文件,有很多的文件和很多的目录,不好管理…...
教程:从pycharm基于anaconda构建机器学习环境并运行第一个 Python 文件
1. 安装 PyCharm 访问 PyCharm 官方网站:https://www.jetbrains.com/pycharm/。下载社区版(免费)或专业版(收费,提供更多功能)。按照操作系统的安装指导安装 PyCharm。安装后打开 PyCharm,并根…...
嵌入式驱动开发详解11(INPUT子系统)
文章目录 前言input子系统简介主要结构体API函数input子系统驱动框架上报事件后续设备树配置方式参考文献 前言 按键、鼠标、键盘、触摸屏等都属于输入(input)设备,Linux 内核为此专门做了一个叫做 input 子系统的框架来处理输入事件。输入设备本质上还是字符设备&…...
动态规划解决目标和问题
代码随想录链接:代码随想录 思路: 可以将数组分为两部分,其中一部分记作left,其中数字的符号全为,而另外一部分记作right,其中数字的符号全为-。这里全为-的意思不是真正的符号为-,而表示这一堆数字在计算时取值为负 因此有如下…...
【漏洞分析】UDF提权漏洞——CVE-2016-6662-MySQL ‘malloc_lib’变量重写命令执行
0x00 前言 最近在做渗透笔记,其中有一个靶机在getshell后,需要进行提权。发现靶机使用root启动的mysql服务,那么尝试使用UDF提权。于是在提权成功后,花了一天时间特意搜了一下整个UDF提权的漏洞原理和利用,加深理解。…...
特种设备安全管理人员免费题库限时练习(判断题)
56.(判断题)特别重大事故、重大事故、较大事故和一般事故,负责事故调查的人民政府应当自收到事故调查报告之日起15日内做出批复。 A.正确 B.错误 答案:错误 57.(判断题)每一类事故灾难的应急救援措施可能千差万别,因此其基本应急模式是不一致的。 A.正确 B.错误 答案:错…...
linux-25 文件管理(三)复制、移动文件,cp,mv
命令cp是copy的简写,而mv则是move的简写。那既然copy是用于实现复制文件的,那通常一般我们要指定其要复制的是谁?而且复制完以后保存在什么地方,对吧?那因此它的使用格式很简单,那就是cp srcfile dest&…...
中国科技统计年鉴EXCEL版(2021-2023年)-社科数据
中国科技统计年鉴EXCEL版(2021-2023年)-社科数据https://download.csdn.net/download/paofuluolijiang/90028724 https://download.csdn.net/download/paofuluolijiang/90028724 中国科技统计年鉴提供了从2021至2023年的详尽数据,覆盖了科技…...
Idea(中文版) 项目结构/基本设置/设计背景
目录 1. Idea 项目结构 1.1 新建项目 1.2 新建项目的模块 1.3 新建项目模块的包 1.4 新建项目模块包的类 2. 基本设置 2.1 设置主题 2.2 设置字体 2.3 设置注释 2.4 自动导包 2.5 忽略大小写 2.6 设置背景图片 3. 项目与模块操作 3.1 修改类名 3.2 关闭项目 1. I…...
jenkins入门--安装jenkins
下载地址https://www.jenkins.io/ jdk 安装 :Jenkins需要安装对应版本的jdk,我在安装过程中显示需要21,17 Java Downloads | Oracle jenkins安装过程参考全网最清晰Jenkins安装教程-windows_windows安装jenkins-CSDN博客 安装完成后,浏览器输入127.0.…...
基于Springboot + vue实现的小型养老院管理系统
🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…...
shell基础使用及vim的常用快捷键
一、shell简介 参考博文1 参考博文2——shell语法及应用 参考博文3——vi的使用 在linux中有很多类型的shell,不同的shell具备不同的功能,shell还决定了脚本中函数的语法,Linux中默认的shell是 / b in/ b a s h ,流行的shell…...
Mac 安装psycopg2出错:Error:pg_config executable not found的解决
在mac 上执行pip3 install psycopg2-binary出现如下错误: Error:pg_config executable not found然后我又到终端里执行 brew install postgresql16 显示 Warning: You are using macOS 15. We do not provide support for this pre-release version. It is expe…...
UniApp | 从入门到精通:开启全平台开发的大门
UniApp | 从入门到精通:开启全平台开发的大门 一、前言二、Uniapp 基础入门2.1 什么是 Uniapp2.2 开发环境搭建三、Uniapp 核心语法与组件3.1 模板语法3.2 组件使用四、页面路由与导航4.1 路由配置4.2 导航方法五、数据请求与处理5.1 发起请求5.2 数据缓存六、样式与布局6.1 样…...
Kafka3.x KRaft 模式 (没有zookeeper) 常用命令
版本号:kafka_2.12-3.7.0 说明:如有多个地址,用逗号分隔 创建主题 bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic demo --partitions 1 --replication-factor 1删除主题 bin/kafka-topics.sh --delete --boots…...