【spark-spring boot】学习笔记
目录
- 说明
- RDD学习
- RDD介绍
- RDD案例
- 基于集合创建RDD
- RDD存入外部文件中
- 转换算子 操作
- map 操作
- 说明
- 案例
- flatMap操作
- 说明
- 案例
- filter 操作
- 说明
- 案例
- groupBy 操作
- 说明
- 案例
- distinct 操作
- 说明
- 案例
- sortBy 操作
- 说明
- 案例
- mapToPair 操作
- 说明
- 案例
- mapValues操作
- 说明
- 案例
- groupByKey操作
- 说明
- 案例
- reduceByKey操作
- 说明
- 案例
- sortByKey操作
- 说明
- 案例
- 行动算子 操作
- collect 操作
- 说明
- 案例
- count 操作
- 说明
- 案例
- first操作
- 说明
- 案例
- take操作
- 说明
- 案例
- countByKey操作
- 说明
- 案例
- saveAsTextFile 操作
- 说明
- 案例
- foreach操作
- 说明
- 案例
说明
本文依赖于上一篇文章:【spark学习】 spring boot 整合 spark 的相关内容,请先阅读上一篇文章,将spark需要的环境先配置好,并测试通过之后再进行此文章的阅读和操作。
RDD学习
RDD介绍
想象一下你有一个大大的数据表,里面包含了很多很多的信息。如果你想对这些数据进行操作,比如筛选出符合条件的数据、或者对数据做一些计算,RDD 就是 Spark 用来存储和操作这些数据的一种方式。它有两个基本操作:转换操作(就像是加工数据)和 行动操作(获取结果)
RDD案例
基于集合创建RDD
import lombok.extern.slf4j.Slf4j;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.util.Arrays;
import java.util.List;/*** spark 案例*/
@Slf4j
@Component
public class DemoTimer {@AutowiredJavaSparkContext javaSparkContext;@AutowiredSparkSession sparkSession;/*** 创建 RDD 算子*/@PostConstructpublic void createRDD() {// 从集合创建 RDDList<String> lists = Arrays.asList("hello", "spark", "hi", "spark", "hadoop");JavaRDD<String> parallelize = javaSparkContext.parallelize(lists); // 创建RDDparallelize.collect().forEach(System.out::println); // 打印}
}
输出结果:
RDD存入外部文件中
将RDD存入外部文件,用于观察文件结果和分区结果。txt文件数等于默认分区数。从结果中看出默认分区为4个。
注意:存放结果的文件夹路径必须没有被创建。
以下案例中,将基于集合生成的RDD保存到saveRddDemo文件夹中。
package www.zhangxiaosan.top.timer;import lombok.extern.slf4j.Slf4j;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.util.Arrays;
import java.util.List;/*** spark 案例*/
@Slf4j
@Component
public class DemoTimer {@AutowiredJavaSparkContext javaSparkContext;@AutowiredSparkSession sparkSession;/*** 创建 RDD 算子*/@PostConstructpublic void createRDD() {// 从集合创建 RDDList<String> lists = Arrays.asList("hello", "spark", "hi", "spark", "hadoop");// parallelize(): 创建RDD,RDD中创建默认分区数// parallelize( 元素, 分区数): 创建RDD,RDD中指定分区数JavaRDD<String> parallelize = javaSparkContext.parallelize(lists); // 创建RDDparallelize.collect().forEach(System.out::println); // 打印// 存储的目录文件夹路径。此处为项目中的路径且目录必须为不存在的路径。String fileSavePath="I:\\zhang\\SpringBootSparkDemo\\src\\main\\resources\\saveRddDemo";parallelize.saveAsTextFile(fileSavePath);// 开始将RDD保存到文件中 }
}
运行结果:
在文件夹中存放的是运行程序生成的文件。如下图。
_SUCCESS文件:成功标记
part-XXX 文件:保存的数据文件 ,结果中有4个文件,说明默认分区为4个。
转换算子 操作
转换算子(Transformation)是指那些返回一个新的 RDD 的操作。转换算子不会立即执行计算,而是构建一个执行计划,只有当行动算子(Action)触发计算时,转换算子的操作才会实际执行。转换算子可以用来处理和转换数据,比如映射、过滤、聚合等。
map 操作
说明
map() 方法传入一个函数作为参数。map() 方法会将RDD中的元素逐一进行调用,函数的参数即是RDD的元素。 如:map( 函数( RDD元素 ) )。 map() 方法会返回一个新的RDD。
案例
将RDD中的每个元素都拼接上字符串 “ say hi ”
package www.zhangxiaosan.top.timer;import lombok.extern.slf4j.Slf4j;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.util.Arrays;
import java.util.List;/*** spark 案例*/
@Slf4j
@Component
public class DemoTimer {@AutowiredJavaSparkContext javaSparkContext;@AutowiredSparkSession sparkSession;/*** 创建 RDD 算子*/@PostConstructpublic void createRDD() {// 从集合创建 RDDList<String> lists = Arrays.asList("张三", "李四", "王五");JavaRDD<String> parallelize = javaSparkContext.parallelize(lists); // 创建RDD// lambda表达式传入匿名函数,进行元素拼接字符。// item 表示RDD中的元素parallelize = parallelize.map(item -> item + " say hi"); parallelize.collect().forEach(System.out::println); // 打印}
}
输出结果:
flatMap操作
说明
flatMap() 方法传入一个函数作为参数 。flatMap() 方法会将RDD中的元素逐一进行调用,函数的参数即是RDD的元素。 如:flatMap( 函数( RDD元素 ) )。 flatMap() 方法会返回一个新的RDD。
flatMap() 方法 会将 RDD的元素扁平化处理成一个集合。
例如:
假设你有一个箱子,箱子里面放着几个小盒子,每个小盒子里又有一些玩具。flatMap 就是一个工具,它能帮你把每个小盒子里的玩具拿出来,直接放进一个大盒子里,最终把所有玩具放在一个地方。
每个小盒子里的玩具可以不止一个,甚至可能没有玩具(比如有的盒子是空的)。flatMap 会把每个盒子里的玩具都拿出来,放到一个大盒子里,最终得到一个扁平的大盒子,里面是所有玩具。
案例
将集合:[ [1, 2, 3, 4, 5],[hello, spark],[张三, 李四] ]
扁平化处理成:[ 1, 2, 3, 4, 5, hello, spark, 张三, 李四]
import lombok.extern.slf4j.Slf4j;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.Arrays;
import java.util.List;/*** spark 案例*/
@Slf4j
@Component
public class DemoTimer {@AutowiredJavaSparkContext javaSparkContext;@AutowiredSparkSession sparkSession;@PostConstructpublic void flatMapDemo() {// 声明集合:[ [1, 2, 3, 4, 5],[hello, spark],[张三, 李四] ]List<List<String>> arrs = Arrays.asList(Arrays.asList("1", "2", "3", "4", "5"),Arrays.asList("hello", "spark"),Arrays.asList("张三", "李四"));//输出声明的集合呢容System.out.println("原始集合打印:");arrs.forEach(item -> System.out.print(" " + item));// 分隔符System.out.println();System.out.println("-----------");System.out.println("flatMap操作后:");// 创建集合的RDDJavaRDD<List<String>> parallelize = javaSparkContext.parallelize(arrs);// flatMap操作List<String> collect = parallelize.flatMap(i -> i.iterator()).collect(); // 打印 flatMap操作 后的集合collect.forEach(item -> System.out.print(" " + item));System.out.println();}
}
filter 操作
说明
filter() 方法传入一个函数作为参数,函数返回值只能为Boolean值。filter() 方法会将RDD中的元素逐一进行调用,函数的参数即是RDD的元素。 如:filter( 函数( RDD元素 ) )。 filter() 方法会返回一个新的RDD。filter() 将RDD元素中满足条件的元素保留,即函数返回为true的元素;RDD中不满足条件的元素,即函数返回为false的元素过滤。
案例
过滤单数,保留双数
import lombok.extern.slf4j.Slf4j;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.util.Arrays;
import java.util.List;/*** spark 案例*/
@Slf4j
@Component
public class DemoTimer {@AutowiredJavaSparkContext javaSparkContext;@AutowiredSparkSession sparkSession;@PostConstructpublic void filterDemo() {// 声明集合List<Integer> arrs = Arrays.asList(-1, 0, 1, 2, 3, 4, 5);System.out.println("原始集合打印:");arrs.forEach(item -> System.out.print(" " + item));// 输出过滤前的数据System.out.println();System.out.println("-----------");System.out.println("filter操作后:");JavaRDD<Integer> parallelize = javaSparkContext.parallelize(arrs);// 过滤掉 单数 (取模不等于0的数字为单数,否则为偶数)。item % 2 == 0 的数字为双数,返回有true保留List<Integer> collect = parallelize.filter(item -> item % 2 == 0).collect();// 输出过滤后的数据collect.forEach(item -> System.out.print(" " + item));System.out.println();}
}
运行结果:
groupBy 操作
说明
将数据按某些条件进行分组。每个组由键值对组成。
groupBy() 常和以下聚合函数一起使用,来对分组数据进行统计分析。
常用的聚合操作包括:
- count(): 统计每个组的元素数量
- sum(): 计算每个组的元素总和
- avg(): 计算每个组的平均值
- max():计算每个组的最大值
- min(): 计算每个组的最小值
- agg(): 自定义聚合操作,可以结合多个聚合函数
案例
给写生成绩按照分数来分组。
import lombok.extern.slf4j.Slf4j;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import scala.Tuple2;
import javax.annotation.PostConstruct;
import java.util.*;/*** spark 案例*/
@Slf4j
@Component
public class DemoTimer {@AutowiredJavaSparkContext javaSparkContext;@AutowiredSparkSession sparkSession;@PostConstructpublic void groupByDemo() {// 定义学生成绩数据List<Tuple2<String, Integer>> students = Arrays.asList(new Tuple2<>("张三", 85),new Tuple2<>("李四", 90),new Tuple2<>("王五", 85),new Tuple2<>("赵六", 95),new Tuple2<>("孙七", 90));// 创建RDDJavaRDD<Tuple2<String, Integer>> parallelize = javaSparkContext.parallelize(students);// 使用 groupBy 进行分组,按成绩分组JavaPairRDD<Object, Iterable<Tuple2<String, Integer>>> integerIterableJavaPairRDD = parallelize.groupBy(tuple -> tuple._2());// 使用 groupBy 按成绩分组。_2表示元组的第二个元素,即分数// 打印结果integerIterableJavaPairRDD.sortByKey().foreach(item -> System.out.println("成绩:" + item._1() + ",学生:" + item._2()));}
}
结果如下:
distinct 操作
说明
对RDD的元素进行分布式去重。返回新的RDD,新的RDD内的元素不重复出现。
案例
将集合中重复的元素去除。
import lombok.extern.slf4j.Slf4j;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import scala.Tuple2;
import javax.annotation.PostConstruct;
import java.util.*;/*** spark 案例*/
@Slf4j
@Component
public class DemoTimer {@AutowiredJavaSparkContext javaSparkContext;@AutowiredSparkSession sparkSession;@PostConstructpublic void distinctDemo() {// 声明集合List<Integer> arrs = Arrays.asList(1,2,3,4,5,6,1,4,6);// 创建RDDJavaRDD<Integer> parallelize = javaSparkContext.parallelize(arrs);// distinct()方法,用于去除重复元素。JavaRDD<Integer> distinct = parallelize.distinct();// 打印结果distinct.collect().forEach(System.out::println);}
}
运行结果:
sortBy 操作
说明
对RDD的元素进行排序,返回新的RDD。
sortBy() 可传入3个参数:
参数1:函数,每个RDD元素都会传入此函数中,此函数定义排序规则。
参数2:boolean值。定义排序顺序。true为升序,false降序。
参数3:Integer 整数,指定分区数量。
案例
将集合中的元素降序排序。
import lombok.extern.slf4j.Slf4j;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import scala.Tuple2;
import javax.annotation.PostConstruct;
import java.util.*;/*** spark 案例*/
@Slf4j
@Component
public class DemoTimer {@AutowiredJavaSparkContext javaSparkContext;@AutowiredSparkSession sparkSession;@PostConstructpublic void sortByDemo() {// 创建无序集合List<Integer> arrs = Arrays.asList(7,2,5,4,1,9,6,3,8);// 创建RDDJavaRDD<Integer> parallelize = javaSparkContext.parallelize(arrs);// 使用 sortBy 进行排序,按元素值排序,并返回一个RDD。JavaRDD<Integer> sortBy = parallelize.sortBy(item -> item, false, 1);// 打印结果sortBy.collect().forEach(System.out::println);}
}
运行结果:
mapToPair 操作
说明
mapToPair()是将一个普通的 RDD 转换为 JavaPairRDD 的一个方法。 JavaPairRDD 中的每个元素都是一个键值对。
mapToPair对RDD的元素进行映射成一个由键值对组成的 RDD(即映射成JavaPairRDD),即将每个元素转换成一个 Tuple2 对象,其中第一个元素是键(key),第二个元素是值(value)。
案例
将集合 [“张三:85”, “李四:90”, “王五:85”, “赵六:95”, “孙七:90”] 中的学生和成绩按照冒号分隔,形成键值对,姓名为键,值为成绩。
import lombok.extern.slf4j.Slf4j;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import scala.Tuple2;
import javax.annotation.PostConstruct;
import java.util.*;/*** spark 案例*/
@Slf4j
@Component
public class DemoTimer {@AutowiredJavaSparkContext javaSparkContext;@AutowiredSparkSession sparkSession;@PostConstructpublic void mapToPairDemo() {// 创建包含学生成绩的列表List<String> students = Arrays.asList("张三:85", "李四:90", "王五:85", "赵六:95", "孙七:90");// 将数据并行化为 RDDJavaRDD<String> studentsRDD = javaSparkContext.parallelize(students);// 使用 mapToPair 将每个元素转换为 (姓名, 成绩) 的键值对JavaPairRDD<String, Integer> studentsPairRDD = studentsRDD.mapToPair((PairFunction<String, String, Integer>) s -> {// 根据冒号分隔学生姓名和成绩,返回一个 (姓名, 成绩) 的元组String[] parts = s.split(":");// 返回一个 (姓名, 成绩) 的元组return new Tuple2<>(parts[0], Integer.parseInt(parts[1]));});// 打印结果studentsPairRDD.collect().forEach(System.out::println);}
}
运行结果:
mapValues操作
说明
mapValues() 是一个用于处理 JavaPairRDD 的方法。它可以对 RDD 中的每个键值对的 值(value) 进行转换,同时保留原来的 键(key) 不变。
案例
将集合 [“张三:85”, “李四:90”, “王五:85”, “赵六:95”, “孙七:90”] 中的学生和成绩按照冒号分隔,形成键值对,姓名为键,值为成绩。并将成绩在原分数上+5分。
import lombok.extern.slf4j.Slf4j;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import scala.Tuple2;
import javax.annotation.PostConstruct;
import java.util.*;/*** spark 案例*/
@Slf4j
@Component
public class DemoTimer {@AutowiredJavaSparkContext javaSparkContext;@AutowiredSparkSession sparkSession;@PostConstructpublic void mapToPairDemo() {// 创建包含学生成绩的列表List<String> students = Arrays.asList("张三:85", "李四:90", "王五:85", "赵六:95", "孙七:90");// 将数据并行化为 RDDJavaRDD<String> studentsRDD = javaSparkContext.parallelize(students);// 使用 mapToPair 将每个元素转换为 (姓名, 成绩) 的键值对JavaPairRDD<String, Integer> studentsPairRDD = studentsRDD.mapToPair((PairFunction<String, String, Integer>) s -> {// 根据冒号分隔学生姓名和成绩,返回一个 (姓名, 成绩) 的元组String[] parts = s.split(":");// 返回一个 (姓名, 成绩) 的元组return new Tuple2<>(parts[0], Integer.parseInt(parts[1]));});// 打印结果System.out.println("原始分数:");studentsPairRDD.collect().forEach(System.out::println);System.out.println("\n+5分后:");// item 表示每个键值对中的值,即分数JavaPairRDD<String, Integer> newValeRdd = studentsPairRDD.mapValues(item -> item + 5);// 打印结果newValeRdd.collect().forEach(System.out::println);}
}
运行结果:
groupByKey操作
说明
groupByKey() 是一个用于处理 JavaPairRDD 的方法。它根据键对数据进行分组,将所有具有相同键的元素聚集到一起,生成一个新的 RDD,其中每个键对应一个包含所有相同键值的集合。
每个键对应的值收集到一个 Iterable 容器中,然后返回一个新的 RDD,其中每个键对应一个包含该键的所有值的 Iterable。
案例
将集合 [“张三:85”, “李四:90”, “陈八:95”, “王五:85”, “黄六:92”] 中的学生和成绩按照冒号分隔,形成键值对,成绩为键,值为姓名。并将键值对中的键进行分类,将相同分数的学生归成一组。
import lombok.extern.slf4j.Slf4j;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import scala.Tuple2;
import javax.annotation.PostConstruct;
import java.util.*;/*** spark 案例*/
@Slf4j
@Component
public class DemoTimer {@AutowiredJavaSparkContext javaSparkContext;@AutowiredSparkSession sparkSession;@PostConstructpublic void groupByKeyDemo(){// 创建包含学生成绩的列表List<String> students = Arrays.asList("张三:85", "李四:90", "陈八:95", "王五:85", "黄六:92");// 将数据并行化为 RDDJavaRDD<String> studentsRDD = javaSparkContext.parallelize(students);// 使用 mapToPair 将每个元素转换为 (成绩, 姓名) 的键值对JavaPairRDD<Integer, String> studentsPairRDD = studentsRDD.mapToPair(s -> {String[] parts = s.split(":");return new Tuple2<Integer, String>(Integer.parseInt(parts[1]), parts[0]);});// 根据键值对中的键进行分类JavaPairRDD<Integer, Iterable<String>> groupedRDD = studentsPairRDD.groupByKey();// 打印结果groupedRDD.collect().forEach(pair -> {System.out.println("成绩: " + pair._1() + ", 姓名: " + pair._2());});}
}
执行结果:
reduceByKey操作
说明
reduceByKey()用于对 JavaPairRDD 数据进行聚合的一个方法。它根据键对值进行合并,并在分区内进行局部聚合,从而减少了跨节点的数据传输,通常比 groupByKey() 更高效。
案例
计算学生的总分。
import lombok.extern.slf4j.Slf4j;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import scala.Tuple2;
import javax.annotation.PostConstruct;
import java.util.*;/*** spark 案例*/
@Slf4j
@Component
public class DemoTimer {@AutowiredJavaSparkContext javaSparkContext;@AutowiredSparkSession sparkSession;@PostConstructpublic void groupByKeyDemo(){// 创建包含学生成绩的列表List<String> students = Arrays.asList("张三:85", "李四:90", "张三:95", "王五:85", "李四:92");// 将数据并行化为 RDDJavaRDD<String> studentsRDD = javaSparkContext.parallelize(students);// 使用 mapToPair 将每个元素转换为 (姓名, 成绩) 的键值对JavaPairRDD<String, Integer> studentsPairRDD = studentsRDD.mapToPair(s -> {String[] parts = s.split(":");return new Tuple2<>(parts[0], Integer.parseInt(parts[1]));});// 使用 groupByKey 按学生姓名进行成绩求和JavaPairRDD<String, Integer> groupedRDD = studentsPairRDD.reduceByKey((a, b) -> a + b);// 打印结果groupedRDD.collect().forEach(pair -> {System.out.println("姓名: " + pair._1() + ", 成绩: " + pair._2());});}
}
运行结果:
sortByKey操作
说明
对 JavaPairRDD 数据按键进行排序的方法。默认为升序。
传入参数为Boolean值:true 升序 ,false降序
案例
将学生成绩按照成绩从高到低降序排序
import lombok.extern.slf4j.Slf4j;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import scala.Tuple2;
import javax.annotation.PostConstruct;
import java.util.*;/*** spark 案例*/
@Slf4j
@Component
public class DemoTimer {@AutowiredJavaSparkContext javaSparkContext;@AutowiredSparkSession sparkSession;@PostConstructpublic void sortByKeyDemo(){// 定义原始数据List<Tuple2<String, Integer>> students = Arrays.asList(new Tuple2<>("张三", 85),new Tuple2<>("李四", 90),new Tuple2<>("王五", 65),new Tuple2<>("赵六", 95),new Tuple2<>("孙七", 90));// 生成RDDJavaPairRDD<String, Integer> studentsPairRDD = javaSparkContext.parallelizePairs(students);// 将学生原集合(姓名,成绩)格式的数据转换为(成绩,姓名)格式的键值对JavaPairRDD<Integer, String> integerStringJavaPairRDD = studentsPairRDD.mapToPair(item -> new Tuple2<>(item._2(), item._1()));// 将(成绩,姓名)格式的键值对按照键降序排序,即按照成绩降序排序JavaPairRDD<Integer, String> stringIntegerJavaPairRDD = integerStringJavaPairRDD.sortByKey(false);// 打印结果stringIntegerJavaPairRDD .collect() .forEach(pair -> {System.out.println("成绩: " + pair._1() + ", 姓名: " + pair._2());});}
}
运行结果:
行动算子 操作
行动算子(Action)是指会触发 Spark 作业的执行,并且会产生一个结果或者副作用的操作。与 转换算子(Transformation)不同,转换算子只会定义数据转换的计算逻辑,而不会立即执行。只有在遇到行动算子时,Spark 才会真正开始计算,并将结果返回给用户或写入外部存储。
当你调用一个行动算子时,Spark 会从头开始执行所有必要的转换操作,并将结果返回给你或者存储到外部系统(如 HDFS、数据库等)。
行动算子通常会返回一个具体的结果,例如一个列表、一个数值,或者在某些情况下,可能会执行一些副作用操作(例如将数据写入磁盘)。
collect 操作
说明
将分布式 RDD 中的所有数据项拉取到本地驱动程序(Driver)中,通常作为一个数组、列表或其他集合类型。因为 collect() 会将整个 RDD 数据集拉到本地,所以如果数据量非常大,可能会导致内存溢出(OutOfMemoryError)。
注意事项:
数据量大时的风险:如果 RDD 中包含的数据量非常大,调用 collect() 会导致所有数据被加载到本地驱动程序的内存中,这可能会导致内存溢出错误(OutOfMemoryError)。因此,建议在数据集非常大的情况下谨慎使用 collect()。
建议:对于大规模数据集,通常会使用其他行动算子(如 take())获取一个数据的子集,避免一次性加载所有数据。
并行计算的代价:尽管 collect() 会将所有数据从分布式环境中拉回到单个节点,但它不会对数据进行额外的计算,只会执行之前定义的转换操作。因此,它本质上是将整个数据集的计算结果从集群中汇总回来。
案例
收集RDD数据并打印。
import lombok.extern.slf4j.Slf4j;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import scala.Tuple2;
import javax.annotation.PostConstruct;
import java.util.*;/*** spark 案例*/
@Slf4j
@Component
public class DemoTimer {@AutowiredJavaSparkContext javaSparkContext;@AutowiredSparkSession sparkSession;@PostConstructpublic void collectDemo(){// 定义一个整数集合List<Integer> arrs = Arrays.asList(1, 2, 3, 4, 5);// 创建RDDJavaRDD<Integer> parallelize = javaSparkContext.parallelize(arrs);// collect()方法,用于将RDD中的数据收集到Driver端,并返回一个List。List<Integer> collect = parallelize.collect();// 打印结果collect.forEach(item -> System.out.println(item));}
}
执行结果:
count 操作
说明
统计RDD中的元素数量。
案例
统计RDD中的元素数量,并输出
import lombok.extern.slf4j.Slf4j;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import scala.Tuple2;
import javax.annotation.PostConstruct;
import java.util.*;/*** spark 案例*/
@Slf4j
@Component
public class DemoTimer {@AutowiredJavaSparkContext javaSparkContext;@AutowiredSparkSession sparkSession;@PostConstructpublic void countDemo(){// 定义一个整数集合List<Integer> arrs = Arrays.asList(1, 2, 3, 4, 5);// 创建RDDJavaRDD<Integer> parallelize = javaSparkContext.parallelize(arrs);// count()方法,统计数量。Long total = parallelize.count();// 打印结果System.out.println("元素数量 = " + total);}
}
运行结果:
first操作
说明
返回RDD中的第一个元素
案例
获取RDD中的第一个元素并打印
import lombok.extern.slf4j.Slf4j;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import scala.Tuple2;
import javax.annotation.PostConstruct;
import java.util.*;/*** spark 案例*/
@Slf4j
@Component
public class DemoTimer {@AutowiredJavaSparkContext javaSparkContext;@AutowiredSparkSession sparkSession;@PostConstructpublic void firstDemo(){// 创建一个集合List<Integer> arrs = Arrays.asList(1, 2, 3, 4, 5);// 创建RDDJavaRDD<Integer> parallelize = javaSparkContext.parallelize(arrs);// 获取第一个元素Integer first = parallelize.first();// 打印结果System.out.println("第一个元素 = " + first);}
}
运行结果:
take操作
说明
在RDD中从头获取指定数量的元素,返回获取的元素集合。
案例
获取前3个元素
import lombok.extern.slf4j.Slf4j;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import scala.Tuple2;
import javax.annotation.PostConstruct;
import java.util.*;/*** spark 案例*/
@Slf4j
@Component
public class DemoTimer {@AutowiredJavaSparkContext javaSparkContext;@AutowiredSparkSession sparkSession;@PostConstructpublic void takeDemo(){// 创建一个集合List<Integer> arrs = Arrays.asList(1, 2, 3, 4, 5);// 创建RDDJavaRDD<Integer> parallelize = javaSparkContext.parallelize(arrs);// 获取前三个元素List<Integer> takes = parallelize.take(3);// 打印结果System.out.println("前三个元素 = " + takes);}
}
运行结果:
countByKey操作
说明
统计RDD中每种键的数量。
案例
根据键值对,统计键值对中不同键的数量。并打印。
import lombok.extern.slf4j.Slf4j;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import scala.Tuple2;
import javax.annotation.PostConstruct;
import java.util.*;/*** spark 案例*/
@Slf4j
@Component
public class DemoTimer {@AutowiredJavaSparkContext javaSparkContext;@AutowiredSparkSession sparkSession;@PostConstructpublic void countByKeyDemo(){// 创建一个集合List<Tuple2<String,Integer>> arrs = Arrays.asList(new Tuple2<String,Integer>("张三",15),new Tuple2<String,Integer>("张三",20),new Tuple2<String,Integer>("李四",20),new Tuple2<String,Integer>("李四",30),new Tuple2<String,Integer>("李四",50),new Tuple2<String,Integer>("王五",10));// 创建JavaPairRDD 对象,JavaPairRDD对象的元素为键值对。JavaPairRDD<String, Integer> parallelize = javaSparkContext.parallelizePairs(arrs);// 使用 countByKey() 方法,统计相同键的数量。Map<String, Long> countByKey = parallelize.countByKey();// 打印结果countByKey.forEach((key, value) -> System.out.println("键: " + key + ", 数量: " + value));}
}
运行结果:
saveAsTextFile 操作
说明
将 RDD 的数据以txt文件保存到外部存储系统。传入指定路径,文件会生成到该路径下。
注意
输出路径不能存在:如果输出路径已经存在,saveAsTextFile 会抛出异常
文件分区:Spark 会将每个分区的数据写入一个独立的文件。因此,如果 RDD 有多个分区,它会生成多个文件,每个文件对应一个分区的数据 。 文件名会根据分区编号进行自动命名,通常形式是:part-00***
文本格式:保存时,RDD 中的每个元素会被转换为文本行。默认情况下,Spark 会把 RDD 中的每个元素的 toString() 输出到文件中。
路径支持分布式存储:saveAsTextFile 支持将数据保存到本地文件系统、HDFS、S3 等分布式存储中。路径的格式取决于存储系统的类型。例如,如果要保存到 HDFS,路径应该以 hdfs:// 开头。
案例
将RDD存入外部文件。
以下案例中,将基于集合生成的RDD保存到saveRddDemo文件夹中。具体参考本文中的 RDD存入外部文件中 内容
import lombok.extern.slf4j.Slf4j;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.SparkSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.Arrays;
import java.util.List;/*** spark 案例*/
@Slf4j
@Component
public class DemoTimer {@AutowiredJavaSparkContext javaSparkContext;@AutowiredSparkSession sparkSession;/*** 创建 RDD 算子*/@PostConstructpublic void createRDD() {// 从集合创建 RDDList<String> lists = Arrays.asList("hello", "spark", "hi", "spark", "hadoop");// parallelize(): 创建RDD,RDD中创建默认分区数// parallelize( 元素, 分区数): 创建RDD,RDD中指定分区数JavaRDD<String> parallelize = javaSparkContext.parallelize(lists); // 创建RDDparallelize.collect().forEach(System.out::println); // 打印// 存储的目录文件夹路径。此处为项目中的路径且目录必须为不存在的路径。String fileSavePath="I:\\zhang\\SpringBootSparkDemo\\src\\main\\resources\\saveRddDemo";parallelize.saveAsTextFile(fileSavePath);// 开始将RDD保存到文件中 }
}
foreach操作
说明
循环遍历RDD中的元素
案例
以上案例中大部分用到此方法,是否用方式看以上案例。
相关文章:
【spark-spring boot】学习笔记
目录 说明RDD学习RDD介绍RDD案例基于集合创建RDDRDD存入外部文件中 转换算子 操作map 操作说明案例 flatMap操作说明案例 filter 操作说明案例 groupBy 操作说明案例 distinct 操作说明案例 sortBy 操作说明案例 mapToPair 操作说明案例 mapValues操作说明案例 groupByKey操作说…...
Delphi ADO组件中的 ADOTable、ADOQurey 无SQL语句实现增、删、改、查
准备: 数据库是Acess数据库 1.放一个 Adoconnection1到 表单上,设置好数据连接字符串 并 设置 connected 属性 为 true 2 设置 adoquery1的connection 属性为 adoconnection1 3 设置 adoquery1的 sql 属性为 select * from 表名 4 设置 adoquery1的 active true …...
力扣整理版九:贪心算法
局部最优 全局最优 局部最优可以推出全局最优 并且想不出反例 ----------------------------- (1) 455 分发饼干 (2) 1005 k次取反后最大化的数组和 (3) 860 柠檬水找零 (4) 376 摆动序列 (5) 738 单调递增的数字 (6) 122 买卖股票的最佳时机2 (7) 135 分发糖果 (8…...
ffmpeg 视频滤镜:高斯模糊-gblur
滤镜描述 gblur 官网地址 > FFmpeg Filters Documentation 这个滤镜会将视频变得模糊。 滤镜使用 参数 gblur AVOptions:sigma <float> ..FV.....T. set sigma (from 0 to 1024) (default 0.5)steps <int> ..FV.....T…...
利用D3.js实现数据可视化的简单示例
目录 一、D3.js选择器 二、数据绑定相关方法 三、DOM操作方法 四、事件监听 五、实现折线图案例 1.首先引入 D3.js 库。 2.然后获取数据(这里定义了销售数据数组作为数据)。 3.接着创建一个 svg 元素作为画布 4.定义 x 轴和 y 轴的比例尺&#…...
Top 10 Tools to Level Up Your Prompt Engineering Skills
此文章文字是转载翻译,图片是自已用AI 重新生成的。文字内容来自 https://www.aifire.co/p/top-10-ai-prompt-engineering-tools 供记录学习使用。 Introduction to AI Prompt Engineering AI Prompt Engineering 简介 1,Prompt Engineering 提示工程…...
sed awk 第二版学习(十一)—— 交互式拼写检查器 spellcheck.awk
目录 1. 脚本代码 2. 执行情况 3. 代码详解 (1)BEGIN 过程 (2)主过程 (3)END 过程 (4)支持函数 4. 附加说明 这是一个基于 UNIX spell 程序的名为 spellcheck 的 awk 脚本&a…...
Android 应用测试的各种环境问题记录(Instrumentation测试)
报错记录 failed to configure packages targetSdkVersion(未解决) failed to configure com.demo.test.SettingsActivityTest.testOnCreate_withNullSavedInstanceState: Package targetSdkVersion34 > maxSdkVersion32 java.lang.IllegalArgumentE…...
python爬虫案例——猫眼电影数据抓取之字体解密,多套字体文件解密方法(20)
文章目录 1、任务目标2、网站分析3、代码编写1、任务目标 目标网站:猫眼电影(https://www.maoyan.com/films?showType=2) 要求:抓取该网站下,所有即将上映电影的预约人数,保证能够获取到实时更新的内容;如下: 2、网站分析 进入目标网站,打开开发者模式,经过分析,我…...
问题记录-Java后端
问题记录 目录 问题记录1.多数据源使用事务注意事项?2.mybatis执行MySQL的存储过程?3.springBoot加载不到nacos配置中心的配置问题4.服务器产生大量close_wait情况 1.多数据源使用事务注意事项? 问题:在springBoot项目中多表处理数…...
YB2503HV:高效率降压IC,助力电动车、太阳能设备等领域的能源转换
今天我要向大家介绍一款引人注目的产品—— YB2503HV 100V 3A SOP8内置MOS 高效率降压IC。这款单片集成芯片具备可设定输出电流的开关型降压恒压驱动器功能,可广泛应用于电动车、太阳能设备、电子电池充电等领域。让我们一起来看看它的特点和应用吧! 首先…...
Day47 | 动态规划 :线性DP 最长公共子序列最长公共子数组
Day47 | 动态规划 :线性DP 最长公共子序列&&最长公共子数组 动态规划应该如何学习?-CSDN博客 本次题解参考自灵神的做法,大家也多多支持灵神的题解 最长公共子序列 编辑距离_哔哩哔哩_bilibili 动态规划学习: 1.思考…...
【山大909算法题】2014-T1
文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 为带表头的单链表类Chain编写一个成员函数Reverse,该函数对链表进行逆序操作(将链表中的结点按与原序相反的顺序连接),要求逆序操作就地进行,不分配…...
《生成式 AI》课程 作业6 大语言模型(LLM)的训练微调 Fine Tuning -- part2
资料来自李宏毅老师《生成式 AI》课程,如有侵权请通知下线 Introduction to Generative AI 2024 Spring 来源背景说明 该文档主要介绍了国立台湾大学(NTU)2024 年春季 “生成式人工智能(GenAI)” 课程的作业 5&#…...
【机器学习】如何使用Python的Scikit-learn库实现机器学习模型,并对数据进行预处理和特征缩放以提高模型性能?
使用Python的Scikit-learn库可以方便地实现机器学习模型,并对数据进行预处理和特征缩放以提高模型性能。以下是一个典型的工作流程,包括数据加载、预处理、特征缩放、模型训练和评估: 1. 安装Scikit-learn 确保已安装Scikit-learn库&#x…...
【SpringCloud详细教程】-04-服务容错--Sentinel
精品专题: 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12789841.html?spm1001.20…...
计算机学习
不要只盯着计算机语言学习,你现在已经学习了C语言和Java,暑假又规划学习Python,最后你掌握的就是计算机语言包而已。 2. 建议你找一门想要深挖的语言,沿着这个方向继续往后学习知识就行。计算机语言是学不完的,而未来就…...
CSS - CSS One-Line
1. aspect-ratio 描述: 用于定义元素的宽高比,简化了以往使用“填充黑客”的方法。只需指定一个比率,浏览器会自动调整元素的尺寸 案例: .aspect-ratio-hd {aspect-ratio: 16/9; } .aspect-ratio-square {aspect-ratio: 1; /* 正方形 */ }2. object-…...
【AIGC】如何准确引导ChatGPT,实现精细化GPTs指令生成
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | 提示词Prompt应用实例 文章目录 💯前言💯准确引导ChatGPT创建爆款小红书文案GPTs指令案例💯 高效开发GPTs应用的核心原则明确应用场景和目标受众构建多样化风格模板提问与引…...
Redis主从架构
Redis(Remote Dictionary Server)是一个开源的、高性能的键值对存储系统,广泛应用于缓存、消息队列、实时分析等场景。为了提高系统的可用性、可靠性和读写性能,Redis提供了主从复制(Master-Slave Replication…...
无人机探测:光电侦测核心技术算法详解!
核心技术 双光谱探测跟踪: 可见光成像技术:利用无人机表面反射的自然光或主动光源照射下的反射光,通过高灵敏度相机捕捉图像。该技术适用于日间晴朗天气下的无人机探测,具有直观、易于识别目标的特点。 红外成像技术࿱…...
34 基于单片机的指纹打卡系统
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52RC,采用两个按键替代指纹,一个按键按下,LCD12864显示比对成功,则 采用ULN2003驱动步进电机转动,表示开门,另一个…...
Day 26
进入贪心算法 基础理论 1、什么是贪心? 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 Eg:一堆钞票,你可以拿走 10 张,想达到最大金额,要怎么拿? –》指定每一次拿最大的࿰…...
11.25c++继承、多态
练习: 编写一个 武器类 class Weapon{int atk; }编写3个武器派生类:短剑,斧头,长剑 class knife{int spd; }class axe{int hp; }class sword{int def; }编写一个英雄类 class Hero{int atk;int def;int spd;int hp; public:所有的…...
ThinkPad t61p 作SMB服务器,打印服务器,pc ,android ,ipad利用此服务器互传文件
1.在t61p上安装win7 2,配置好smb 服务 3.再安装好打印驱动程序 4.pc与win7利用系统的网络互相发现,映射为硬盘使用。 5.android,ipad安装ES文件浏览器访问win7 共享文件夹,互传文件。 6.android手机安装FE文件浏览器,可以利用花生壳外网…...
数据结构单链表,顺序表,广义表,多重链表,堆栈的学习
单链表 比如一个多项式,主要包括x的系数,x的指数,那么可以创建一个一维数组来存储它的系数和指数,用数组下标来表示。它的系数可以用数组下标对应的数组元素来储存。 可是这样储存会浪费空间所以采用单链表形式来存储。 即创建一…...
uniapp内嵌的webview H5与应用通信
H5端: 1、找到index.html引入依赖 <script type"text/javascript" src"https://unpkg.com/dcloudio/uni-webview-js0.0.3/index.js"></script> 2、在需要通讯处发送消息 uni.postMessage({data:{code:200,msg:"处理完成&q…...
黄仁勋:人形机器人在内,仅有三种机器人有望实现大规模生产
11月23日,芯片巨头、AI时代“卖铲人”和最大受益者、全球市值最高【英伟达】创始人兼CEO黄仁勋在香港科技大学被授予工程学荣誉博士学位;并与香港科技大学校董会主席沈向洋展开深刻对话,涉及人工智能(AI)、计算力、领导…...
Docker--harbor私有仓库部署与管理
目录 一、Harbor 简介 1.1 什么是Harbor 1.2 Harbor的特性 1.3 Harbor的构成 二、Harbor 部署 2.1 部署 Docker-Compose 服务 2.2 部署 Harbor 服务 (1)下载或上传 Harbor 安装程序 (2)修改harbor安装的配置文件 2.3 启…...
35 基于单片机的精确电压表DA-AD转换
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,采用DAC0832和ADC0832检测电压,0到8.5V,设计复位电路 LED管显示实际稳压值,初始电压0 二、硬件资源 基于KEIL5编写C代码,…...
Windows系统下安装Triton 3.0.0预编译Triton 2.1.0
Triton是一个用于编写高效自定义深度学习原语的语言和编译器。它旨在提供一个开源环境,使得编写代码的速度比CUDA更快,同时比其他现有的DSLs(领域特定语言)更灵活。 在开始安装之前,请确保您的系统满足以下要求&#x…...
Easyexcel(7-自定义样式)
相关文章链接 Easyexcel(1-注解使用)Easyexcel(2-文件读取)Easyexcel(3-文件导出)Easyexcel(4-模板文件)Easyexcel(5-自定义列宽)Easyexcel(6-单…...
ubuntu搭建k8s环境详细教程
在Ubuntu上搭建Kubernetes(K8s)环境可以通过多种方式实现,下面是一个详细的教程,使用kubeadm工具来搭建Kubernetes集群。这个教程将涵盖从准备工作到安装和配置Kubernetes的所有步骤。 环境准备 操作系统:确保你使用的…...
spark 写入mysql 中文数据 显示?? 或者 乱码
目录 前言 Spark报错: 解决办法: 总结一下: 报错: 解决: 前言 用spark写入mysql中,查看中文数据 显示?? 或者 乱码 Spark报错: Sat Nov 23 19:15:59 CST 2024 WARN: Establishing SSL…...
Python中的简单爬虫
文章目录 一. 基于FastAPI之Web站点开发1. 基于FastAPI搭建Web服务器2. Web服务器和浏览器的通讯流程3. 浏览器访问Web服务器的通讯流程4. 加载图片资源代码 二. 基于Web请求的FastAPI通用配置1. 目前Web服务器存在问题2. 基于Web请求的FastAPI通用配置 三. Python爬虫介绍1. 什…...
网络安全原理与技术思考题/简答题
作业1(第1章、第2章、第8章) 1. 网络安全的基本属性有哪些?简单解释每个基本属性的含义。网络安全的扩展属性包括哪些? 基本属性: 1.机密性(Confidentiality): 含义:确保信息不被未授权的用户…...
技术周刊 | 前端真的凉了吗?2024 前端趋势解读
大家好,我是童欧巴。见字如面,万事胜意。 小雪已过,大家勿忘添衣御寒,欢迎来到第 135 期周刊。 大厨推荐 2024 前端趋势 The Software House 公司发布的前端状态调查报告,本版是迄今为止最全面的调查,共…...
Qt常用控件之按钮类控件
目录 QPushButton 添加图标 添加快捷键 QRadioButton 关于toggled 模拟点餐功能 QCheckBox 刚刚 QWidget 中涉及到的各种 属性/函数/使用方法,针对接下来要介绍的 Qt 的各种控件都是有效的,因为各种控件都是继承自 QWidget 的 接下来本篇博客就学…...
Wonder3D本地部署到算家云搭建详细教程
Wonder3D简介 Wonder3D仅需2至3分钟即可从单视图图像中重建出高度详细的纹理网格。Wonder3D首先通过跨域扩散模型生成一致的多视图法线图与相应的彩色图像,然后利用一种新颖的法线融合方法实现快速且高质量的重建。 本文详细介绍了在算家云搭建Wonder3D的流程以及…...
景联文科技:高质量数据采集标注服务引领AI革新
在当今这个数字化时代,数据已经成为推动社会进步和产业升级的关键资源。特别是在人工智能领域,高质量的数据是训练出高效、精准的AI模型的基础。景联文科技是一家专业的数据采集与标注公司,致力于为客户提供高质量的数据处理服务,…...
企业面试真题----阿里巴巴
1.HashMap为什么不是线程安全的? 首先hashmap就是为单线程设计的,并不适合于多线程环境,而hashmap的线程不安全原因主主要是以下两个原因: 死循环 死循环问题发生在jdk1.8之前(不包含1.8),造…...
极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【四】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
【C++知识总结2】C++里面的小配角cout和cin
一、引入 第一个关于输入输出的C代码 #include<iostream> // std是C标准库的命名空间名,C将标准库的定义实现都放到这个命名空间中 using namespace std; int main() {cout<<"Hello world!!!"<<endl;return 0; } 1. 使用cout标准输出…...
门控循环单元(GRU)与时间序列预测应用
一、GRU简介 门控循环单元(Gated Recurrent Unit,简称GRU)是一种简化版的LSTM(长短期记忆网络),专门用于解决长序列中的梯度消失问题。与LSTM相比,GRU具有更简单的结构和较少的参数,…...
Spring Boot 3 集成 Spring Security(2)授权
文章目录 授权配置 SecurityFilterChain基于注解的授权控制自定义权限决策 在《Spring Boot 3 集成 Spring Security(1)》中,我们简单实现了 Spring Security 的认证功能,通过实现用户身份验证来确保系统的安全性。Spring Securit…...
互联网摸鱼日报(2024-11-22)
互联网摸鱼日报(2024-11-22) 36氪新闻 学习马斯克不丢人,脸书也开始改造自己了 旅游行业趋势变了,增长还能从哪里寻找? 大厂入局后,小型小游戏团队能否继续喝一口汤? 一拥而上的“跨界咖啡”,是“走心”…...
RNN并行化——《Were RNNs All We Needed?》论文解读
InfoPaperhttps://arxiv.org/abs/2410.01201GitHubhttps://github.com/lucidrains/minGRU-pytorch个人博客地址http://myhz0606.com/article/mini_rnn 最近在看并行RNN相关的paper,发现很多都利用了Parallel Scanning算法。本文将从Parallel Scanning算法开始&…...
机器学习周志华学习笔记-第6章<支持向量机>
机器学习周志华学习笔记-第6章<支持向量机> 卷王,请看目录 6支持向量机6.1 函数间隔与几何间隔6.1.1 函数间隔6.1.2 几何间隔 6.2 最大间隔与支持向量6.3 对偶问题6.4 核函数6.5 软间隔支持向量机6.6 支持向量机6.7核方法 6支持向量机 支持向量机是一种经典…...
IP反向追踪技术,了解一下?
DOSS(拒绝服务)攻击是现在比较常见的网络攻击手段。想象一下,有某个恶意分子想要搞垮某个网站,他就会使用DOSS攻击。这种攻击常常使用的方式是IP欺骗。他会伪装成正常的IP地址,让网络服务器以为有很多平常的请求&#…...
2025蓝桥杯(单片机)备赛--扩展外设之UART1的原理与应用(十二)
一、串口1的实现原理 a.查看STC15F2K60S2数据手册: 串口一在590页,此款单片机有两个串口。 串口1相关寄存器: SCON:串行控制寄存器(可位寻址) SCON寄存器说明: 需要PCON寄存器的SMOD0/PCON.6为0,使SM0和SM…...