【Spark Core】(二)RDD编程入门

目录

  • 1 程序入口:SparkContext对象
  • 2 RDD的创建
    • 2.1 本地创建
    • 2.2 读取文件创建
  • 3 RDD算子
  • 4 常用Transform算子
    • 4.1 map算子
    • 4.2 flatMap算子
    • 4.3 reduceBykey算子
    • 4.4 mapValues算子
    • <实例> WordCount
    • 4.5 groupBy算子
    • 4.6 filter算子
    • 4.7 distinct算子
    • 4.8 union算子
    • 4.9 join算子
    • 4.10 intersection算子
    • 4.11 glom算子
    • 4.12 groupByKey算子
    • 4.13 sortBy算子
    • 4.14 sortByKey算子
  • 5 常用Action算子
    • 5.1 collect算子
    • 5.2 reduce算子
    • 5.3 fold算子
    • 5.4 first算子
    • 5.5 take算子
    • 5.6 takeSample算子
    • 5.7 takeOrdered算子
    • 5.8 foreach算子
    • 5.9 saveAsTextFile算子
  • 6 分区操作算子
    • 6.1 mapPartitions算子【Transform】
    • 6.2 foreachPartition算子【Action】
    • 6.3 partitionBy算子【Transform】
    • 6.4 repartition算子【Transform】
  • 7 groupByKey VS reduceByKey

1 程序入口:SparkContext对象

  • 只有构建出SparkContext,基于它才能执行后续的API调用和计算

2 RDD的创建

2.1 本地创建

# coding:utf8
from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize([1, 2, 3, 4, 5, 6, 7, 8, 9])print("默认分区数:", rdd.getNumPartitions())rdd = sc.parallelize([1, 2, 3], 3)print("分区数:", rdd.getNumPartitions())print("RDD内容:", rdd.collect())

2.2 读取文件创建

  • textFile API:可以读取本地数据,也可以读取hdfs数据
  • 用法:
    • sparkcontext.textFile(参数1, 参数2)
    • 参数1:必填,文件路径,支持本地文件/HDFS文件/S3协议
    • 参数2:可选,表示最小分区数量
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("Local[*]")sc = SparkContext(conf=conf)# 读取本地文件file_rdd1 = sc.textFile("../data/input/words.text")print("默认分区数:", file_rdd1.getNumPartitions())print("file_rdd内容:", file_rdd1.collect())file_rdd2 = sc.textFile("../data/input/words.text", 3)print("file_rdd2分区数:", file_rdd2.getNumPartitions())file_rdd3 = sc.textFile("../data/input/words.text", 100)print("file_rdd3分区数:", file_rdd3.getNumPartitions())# 读取HDFS文件hdfs_rdd = sc.textFile("hdfs://node1:8020/input/words.txt")print("hdfs_rdd内容", hdfs_rdd.collect())
  • wholeTextFile:小文件读取专用
  • 用法:
    • sparkcontext.wholeTextFile(参数1, 参数2)
    • 参数1:必填,文件路径,支持本地文件/HDFS文件/S3协议
    • 参数2:可选,表示最小分区数量
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("Local[*]")sc = SparkContext(conf=conf)rdd = sc.wholeTextFiles("../data/input/tiny_files")print(rdd.map(lambda x:x[1]).collect())

3 RDD算子

  • 算子:分布式集合对象上的API(方法/函数:本地对象的API)
  • 分类
    • Transform:转换算子
      • 定义:返回值仍是RDD
      • 特性: lazy懒加载,如果没有Action算子,Transform算子不工作
    • Action:动作/行动算子
      • 定义:返回值不是RDD

4 常用Transform算子

4.1 map算子

  • 功能: 将RDD的数据逐条处理,返回新的RDD
rdd.map(func)
# func: f:(T) -> U
# f: 函数(方法)
# (T) -> U: 方法的定义
# T/U: 泛型,此处表示任意类型
#  (T) -> U: 表示一个方法,接受一个传入参数,类型不限,返回一个返回值,类型不限
#  (A) -> A: 表示一个方法,接受一个传入参数,类型不限,返回一个返回值,与传入参数类型一致
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize([1, 2, 3, 4, 5, 6], 3)print(rdd.map(lambda data: data * 10).collect())# [10, 20, 30, 40, 50, 60]

4.2 flatMap算子

  • 功能:对RDD执行map操作,然后进行解除嵌套操作 【降维】
rdd.flatMap(func)
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd1 = sc.parallelize(["aaa bbb ccc", "ab bc cd", "aaa abc ccc"])rdd2 = rdd1.map(lambda line: line.split(" "))print(rdd2.collect())# [['aaa', 'bbb', 'ccc'], ['ab', 'bc', 'cd'], ['aaa', 'abc', 'ccc']]rdd3 = rdd1.flatMap(lambda line: line.split(" "))print(rdd3.collect())# ['aaa', 'bbb', 'ccc', 'ab', 'bc', 'cd', 'aaa', 'abc', 'ccc']

4.3 reduceBykey算子

  • 功能:针对KV型RDD,自动按照Key分组,然后依据传入的聚合逻辑,完成Value的聚合计算
rdd.reduceByKey(func)
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize([('a', 1), ('a', 2), ('b', 3), ('b', 4), ('c', 5)])res = rdd.reduceByKey(lambda a, b: a + b)print(res.collect())# [('b', 7), ('a', 3), ('c', 5)]

4.4 mapValues算子

  • 功能:针对二元元组RDD,对其内部Value进行map操作
rdd.mapValues(func)
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize([('a', 1), ('a', 2), ('b', 3), ('c', 5)])res = rdd.mapValues(lambda x: x * 10)# 等价于:rdd.map(lambda x: x[0], x[1] * 10)print(res.collect())# [('a', 10), ('a', 20), ('b', 30), ('c', 50)]

<实例> WordCount

# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)# 读取待处理文件file = sc.textFile("./Data/words.txt")# 分割单词并降维rdd1 = file.flatMap(lambda line: line.split(" "))# ['Hadoop', 'Spark', 'Java', 'Python', 'Hadoop', 'Python', 'Spark', 'Java', 'Python']# 将单词转换为kv元组rdd2 = rdd1.map(lambda word: (word, 1))# [('Hadoop', 1), ('Spark', 1), ('Java', 1), ('Python', 1), ('Hadoop', 1), ('Python', 1), ('Spark', 1), ('Java', 1), ('Python', 1)]# 聚合统计res = rdd2.reduceByKey(lambda a, b: a + b)# 输出结果print(res.collect())# [('Hadoop', 2), ('Java', 2), ('Python', 3), ('Spark', 2)]

4.5 groupBy算子

  • 功能:将RDD的数据进行分组
rdd.groupBy(func)
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize([('a', 1), ('a', 1), ('b', 1), ('b', 1), ('b', 1)])res = rdd.groupBy(lambda t: t[0])print(res.collect())# [('b', <pyspark.resultiterable.ResultIterable object at 0x104ffd970>), ('a', <pyspark.resultiterable.ResultIterable object at 0x105005850>)]print(res.map(lambda t: (t[0], list(t[1]))).collect())# [('b', [('b', 1), ('b', 1), ('b', 1)]), ('a', [('a', 1), ('a', 1)])]

4.6 filter算子

  • 功能:数据过滤保留为True的结果
rdd.filter(func)
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize([1, 2, 3, 4, 5, 6])res = rdd.filter(lambda x: x % 2 == 1)print(res.collect())# [1, 3, 5]

4.7 distinct算子

  • 功能:对RDD数据进行去重,返回新的RDD
rdd.distinct(参数1)
# 参数1: 去重分区数量,一般无需填写
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize([1, 1, 2, 2, 3, 3])res = rdd.distinct()print(res.collect())# [1, 2, 3]rdd2 = sc.parallelize([('a', 1), ('a', 1), ('b', 1), ('b', 1)])res2 = rdd2.distinct()print(res2.collect())# [('b', 1), ('a', 1)]

4.8 union算子

  • 功能:2个RDD合并为1个返回(不去重,不限类型)
rdd.union(other_rdd)
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd1 = sc.parallelize([1, 1, 2, 3])rdd2 = sc.parallelize(['a', 'b', 'c'])res = rdd1.union(rdd2)print(res.collect())# [1, 1, 2, 3, 'a', 'b', 'c']

4.9 join算子

  • 功能:对两个二元元组RDD执行join操作(可实现SQL的内/外连接)
rdd.join(other_rdd) 	# 内连接
rdd.leftOuterJoin(other_rdd)	# 左外连接
rdd.rightOuterJoin(other_rdd)	# 右外连接
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)staff = sc.parallelize([(1001, 'Sam'), (1002, 'Lily'), (1003, 'John'), (1004, 'Rebecca')])dept = sc.parallelize([(1001, '销售部'), (1002, '科技部')])print(staff.join(dept).collect())# [(1001, ('Sam', '销售部')), (1002, ('Lily', '科技部'))]print(staff.leftOuterJoin(dept).collect())# [(1001, ('Sam', '销售部')), (1002, ('Lily', '科技部')), (1003, ('John', None)), (1004, ('Rebecca', None))]print(staff.rightOuterJoin(dept).collect())# [(1001, ('Sam', '销售部')), (1002, ('Lily', '科技部'))]

4.10 intersection算子

  • 功能:求两个RDD的交集,返回一个新的RDD
rdd.intersection(other_rdd) 
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd1 = sc.parallelize([1, 2, 3, 4, 5])rdd2 = sc.parallelize([4, 5, 6, 7, 8])res = rdd1.intersection(rdd2)print(res.collect())# [4, 5]

4.11 glom算子

  • 功能:将RDD的数据按照分区加上嵌套【升维】
rdd.glom() 
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize([1, 2, 3, 4, 5, 6, 7, 8, 9], 3)print(rdd.glom().collect())# [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 升维print(rdd.glom().flatMap(lambda x:x).collect())# [1, 2, 3, 4, 5, 6, 7, 8, 9] 降维

4.12 groupByKey算子

  • 功能:针对kv型RDD,按照key分组
rdd.groupByKey() 
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize([('a', 1), ('a', 1), ('b', 1), ('b', 1), ('b', 1)])res = rdd.groupByKey()print(res.collect())# [('b', < pyspark.resultiterable.ResultIterable object at 0x101946f30 >), ('a', < pyspark.resultiterable.ResultIterable object at 0x1019450d0 >)]print(res.map(lambda x:(x[0], list(x[1]))).collect())# [('b', [1, 1, 1]), ('a', [1, 1])]

4.13 sortBy算子

  • 功能:将RDD数据按照指定依据排序(局部分区内有序)
rdd.sortBy(func, ascending=False, numPartitions=1)
# func: (T) -> U, 指定排序依据
# ascending: True 升序, False 降序
# numPartitions: 用多少分区排序, 全局排序时需设置为1
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize([('a', 1), ('a', 2), ('b', 5), ('b', 3), ('c', 4), ('e', 1), ('m', 9)], 3)# 依据value排序res = rdd.sortBy(lambda x: x[1], ascending=True, numPartitions=3)print(res.collect())# [('a', 1), ('e', 1), ('a', 2), ('b', 3), ('c', 4), ('b', 5), ('m', 9)]# 依据key排序res2 = rdd.sortBy(lambda x: x[0], ascending=False, numPartitions=3)print(res2.collect())# [('m', 9), ('e', 1), ('c', 4), ('b', 5), ('b', 3), ('a', 1), ('a', 2)]

4.14 sortByKey算子

  • 功能:将kv型RDD数据按照key排序
rdd.sortByKey(ascending=False, numPartitions=None, keyfunc=<function RDD.<lambda>>) 
# ascending: True 升序(默认), False 降序
# numPartitions: 用多少分区排序, 全局排序时需设置为1
# keyfunc: 在排序前对key进行处理, (k) -> U, 传入一个参数,返回一个值
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize([('a', 1), ('A', 2), ('b', 5), ('B', 3), ('c', 4), ('E', 1), ('m', 9)], 3)res = rdd.sortByKey(ascending=True, numPartitions=1, keyfunc=lambda key:str(key).lower())print(res.collect())# [('a', 1), ('A', 2), ('b', 5), ('B', 3), ('c', 4), ('E', 1), ('m', 9)]

5 常用Action算子

5.1 collect算子

  • 功能:将RDD各个分区的数据,统一收集到driver中,返回一个ist对象
rdd.collect() 

5.2 reduce算子

  • 功能:将rdd按照传入的逻辑进行聚合
rdd.reduce(func) 
# func: (T, T) -> T
# 2个传入参数,1个返回值,类型相同
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize(range(1, 10))res = rdd.reduce(lambda a, b: a+b)print(res)# 45

5.3 fold算子

  • 功能:和reduce一样,接受传入逻辑进行聚合,聚合时带有初始值
rdd.fold(func) 
# 聚合初始值作用于:分区内聚合 & 分区间聚合
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize(range(1, 10), 3)# 聚合时带有初始值10:res = rdd.fold(10, lambda a, b: a+b)# 分区内聚合:# [1, 2, 3] -> 10+1+2+3=16# [4, 5, 6] -> 10+4+5+6=25# [7, 8, 9] -> 10+7+8+9=34# 分区间聚合:# 10+16+25+34=85print(res)# 85

5.4 first算子

  • 功能:返回RDD的第一个元素
rdd.first() 
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize(range(1, 10))print(rdd.first())# 1

5.5 take算子

  • 功能:取出RDD的前n个元素,返回一个list
rdd.take(n) 
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize(range(1, 10))print(rdd.take(5))# [1, 2, 3, 4, 5]

5.6 takeSample算子

  • 功能:随机抽样RDD的数据
rdd.takeSample(参数1: True/False, 参数2: 采样数, 参数3: 随机数种子) 
# 参数1:能否重复抽取同一个位置的数据
# 参数2:抽样数
# 参数3:随机数种子,如果传入同一个数字,取出的结果一致;如不传,Spark会自动随机赋值
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize([1, 2, 3, 4, 5], 1)print(rdd.takeSample(True, 10))# [4, 3, 3, 3, 4, 3, 1, 1, 2, 2]print(rdd.takeSample(False, 10))# [1, 2, 4, 3, 5]

5.7 takeOrdered算子

  • 功能:对RDD进行排序取前N个
rdd.takeOrdered(参数1, 参数2) 
# 参数1:N
# 参数2:对排序的依据进行更改,不会改变数据本身
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize([1, 3, 5, 7, 9], 1)print(rdd.takeOrdered(3))# [1, 3, 5]print(rdd.takeOrdered(3, lambda x: -x))# [9, 7, 5]

5.8 foreach算子

  • 功能:对RDD的每个元素,执行传入的操作逻辑(没有返回值的map方法)
  • 在Executor直接执行,不用拉回Driver中对外输出,效率更高
rdd.foreach(func)
# func: (T) -> None 
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize([1, 2, 3, 4, 5], 1)res = rdd.foreach(lambda x: x * 10)print(res)# Noneres = rdd.foreach(lambda x: print(x * 10))# 10# 20# 30# 40# 50

5.9 saveAsTextFile算子

  • 功能:将RDD的数据写入文本文件中
  • 支持本地写入、HDFS等
  • RDD有几个分区,就有几个文件
  • 在Executor中执行,性能较好
rdd.saveAsTextFile(路径) 
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize([1, 2, 3, 4, 5], 1)rdd.saveAsTextFile("../Data/output/out1")rdd.saveAsTextFile("hdfs://node1:8020/output/out1")

6 分区操作算子

6.1 mapPartitions算子【Transform】

  • 功能:和普通map一样,但一次传递一整个分区的数据,作为一个迭代器(一次性List)对象传入
    在这里插入图片描述
rdd.mapPartitions(func) 
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize([1, 2, 3, 4, 5], 3)def process(iter):res = []for i in iter:res.append(i * 10)return resprint(rdd.mapPartitions(process).collect())# [10, 20, 30, 40, 50]

6.2 foreachPartition算子【Action】

  • 功能:和普通foreach一样,一次处理一整个分区数据
  • foreachPartition就是一个没有返回值的mapPartitions
rdd.foreachPartition() 
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize([1, 2, 3, 4, 5, 6, 7], 3)def process(iter):res = []for i in iter:res.append(i * 10)print(res)rdd.foreachPartition(process)# [30, 40]# [10, 20]# [50, 60, 70]

6.3 partitionBy算子【Transform】

  • 功能:对RDD进行自定义分区操作
rdd.partitionBy(参数1, 参数2) 
# 参数1:重新分区后有几个分区
# 参数2:func, 自定义分区规则,函数传入;(K) -> int
# 分区编号从0开始
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize([('a', 1), ('b', 2), ('c', 3), ('c', 4), ('d', 5)])def process(k):if 'a' == k or 'b' == k: return 0if 'c' == k: return 1return 2print(rdd.partitionBy(3, process).glom().collect())# [[('a', 1), ('b', 2)], [('c', 3), ('c', 4)], [('d', 5)]]

6.4 repartition算子【Transform】

  • 功能:对RDD的分区执行重新分区(仅数量)
  • 注意:对分区数量进行操作一定要慎重;因为修改分区数量会影响并行计算(内存迭代的并行管道数量);分区增加极大可能会导致shuffle
rdd.repartition(N)
# N:新分区数 
# coding:utf8from pyspark import SparkConf, SparkContextif __name__ == '__main__':conf = SparkConf().setAppName("test").setMaster("local[*]")sc = SparkContext(conf=conf)rdd = sc.parallelize([1, 2, 3, 4, 5], 3)print(rdd.repartition(1).getNumPartitions())# 1print(rdd.repartition(5).getNumPartitions())# 5# coalesceprint(rdd.coalesce(1).getNumPartitions())# 1print(rdd.coalesce(5).getNumPartitions())# 3print(rdd.coalesce(5, True).getNumPartitions())# 5

7 groupByKey VS reduceByKey

  • 功能上
    • groupByKey:分组
    • reduceByKey:分组+聚合
  • 性能上
    • reduceByKey的性能远大于groupByKey + 聚合逻辑
    • groupByKey + 聚合:先分组(shuffle)后聚合
      groupByKey + 聚合
    • reduceByKey:先在分区内做预聚合,再分组(shuffle),再最终聚合。【减少shuffle数据量,降低网络IO开销,极大提升性能;数据量越大,优势越大】
      reduceByKey

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

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

相关文章

java IDEA run/Debug异常:“jdk1.8injava.exe“ CreateProcess error=206, 文件名或扩展名太长

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#,Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开发…

Java 函数编程之【过滤器filter()合并】【predicate(断言)】与【谓词逻辑】

Java函数式编程之【过滤器filter合并】【predicate&#xff08;断言&#xff09;】与【谓词逻辑】一、合并多个过滤器filter &#xff08;Lambda版本&#xff09;二、合并多个过滤器filter &#xff08;谓词逻辑&#xff08;Predicate&#xff09;版本&#xff09;&#xff08;…

CentOS10安装RabbitMQ

1.下载资源 &#xff08;1&#xff09;下载erlang-rpm 注意&#xff1a;按照图片中的下载&#xff0c;用绿色三角形指向的是重点关注的。 网址&#xff1a; erlang-rpmhttps://github.com/rabbitmq/erlang-rpm/releases &#xff08;2&#xff09;下载rabbitmq-server 注…

JVM——八股文

1. JDK, JRE和JVM的关系JDK JRE Java开发工具JRE JVM Java核心类库JDK供Java程序开发人员开发软件&#xff0c;JRE供客户使用&#xff0c;只需要JVM运行环境即可。JVM运行的是class字节码&#xff0c;不仅能运行Java代码&#xff0c;还能运行其他语言&#xff0c;只要语言能…

骑行把带定期换,维乐 Skin Wrap 把带焕新骑行

在公路骑行的装备体系里&#xff0c;把带是最易被忽视却至关重要的“消耗品”。它是骑手手部与车身的直接连接&#xff0c;每一次转向、变速、刹车&#xff0c;都需通过把带传递力量与操控意图&#xff1b;同时&#xff0c;它还承担着吸汗、减震、保护车把的作用。可长期使用后…

LeetCode100-73矩阵置零

本文基于各个大佬的文章 上点关注下点赞&#xff0c;明天一定更灿烂&#xff01; 前言 Python基础好像会了又好像没会&#xff0c;所有我直接开始刷leetcode一边抄样例代码一边学习吧。本系列文章用来记录学习中的思考&#xff0c;写给自己看的&#xff0c;也欢迎大家在评论区指…

宁波市第八届网络安全大赛 -- Crypto -- WriteUp

宁波市第八届网络安全大赛 – Crypto – WriteUp Three-prime RSA task import gmpy2 from Crypto.Util.number import *from secret import flagp getPrime(512) q getPrime(512) r getPrime(512) n p * q * r random_num getPrime(28) D ((p q r) * random_num) % n …

大语言模型 (LLM) 与多模态大模型 (MLM)

文章目录概述&#xff1a;从“模型”到“大”模型1、大语言模型 (Large Language Model, LLM)1.1 定义与概述关键特征&#xff1a;1.2 核心技术与架构Transformer架构自注意力机制 (Self-Attention)1.3 训练过程1.4 工作原理2. 多模态大模型 (Multimodal Large Model, MLM)2.1 …

HTML应用指南:利用GET请求获取全国招商银行网点位置信息

招商银行&#xff08;China Merchants Bank, CMB&#xff09;作为中国领先的股份制商业银行&#xff0c;始终坚持“以客户为中心”的服务理念&#xff0c;致力于为个人客户、企业客户及机构客户提供专业、高效、便捷的综合金融服务。依托“轻型银行”战略与“金融科技银行”建设…

JVM性能监控工具的使用

了解JVM性能监控工具并能熟练使用&#xff0c;是Java开发者进阶的必备技能。下面本文将为你介绍一些主流的JVM性能监控工具及其使用方法&#xff0c;并通过一些场景案例来分析如何应用这些工具解决实际问题。 &#x1f6e0;️ JVM性能监控与调优工具指南 ✨ 工具概览 以下是几款…

【工作】一些找工作需要了解避雷的知识

面试前 1.公司的具体情况 公司全称&#xff0c;办公地点&#xff0c;涉及岗位 要求hr做个简单的公司介绍 2.岗位职责/业务方向 工作内容、公司业务 3.薪资待遇&#xff0c;构成&#xff0c;底薪&#xff0c;五险一金 问一下工资范围 底薪 &#xff08;有责&#xff0c;无…

五、练习2:Git分支操作

练习2&#xff1a;Git分支操作 练习目标 掌握Git分支的创建、切换、合并等操作&#xff0c;理解分支在开发中的作用。 练习步骤 步骤1&#xff1a;准备基础仓库 # 创建练习目录 mkdir branch-practice cd branch-practice# 初始化仓库 git init# 创建初始文件 echo "# 分支…

【笔记】算法设计:异或空间线性基

Content1.什么是异或&#xff08;定义和性质&#xff09;2.异或空间线性基的构造方法3.异或空间线性基的应用4.算法设计例举5.小结说明算法设计应用之前&#xff0c;首先明确异或空间线性基&#xff1a;一种数据结构。用于处理异或关系&#xff08;运算&#xff09;下的向量空间…

Filebeat采集数据与日志分析实战

&#x1f31f;Filebeat采集数据的原理 Filebeat默认按行采集数据&#xff0c;如果数据没有换行&#xff0c;则该条数据无法采集到 属于有状态服务&#xff0c;可以记录上一次采集数据的位置点信息 修改配置文件 vim /etc/filebeat/config/03-log-to-console.yaml filebeat.inp…

Fluent Bit针对kafka心跳重连机制详解(下)

#作者&#xff1a;程宏斌 文章目录disconnectreconnect接上篇&#xff1a;https://blog.csdn.net/qq_40477248/article/details/150957571?spm1001.2014.3001.5501disconnect 断开连接的情况主要是两种: 连接或传输过程中有错误发生 超时, 比如空闲时间超时 ** * Close and …

React 第七十一节 Router中generatePath的使用详解及注意事项

前言 generatePath 是 React Router 的一个实用工具函数&#xff0c;用于根据路径模式和参数对象生成实际的 URL 路径。它在需要动态构建链接的场景中非常有用&#xff0c;比如生成导航链接或重定向路径。 1、基本用法和注意事项 import { generatePath } from react-router-do…

Python 爬虫案例:爬取豆瓣电影 Top250 数据

一、案例背景与目标 豆瓣电影 Top250 是国内权威的电影评分榜单之一&#xff0c;包含电影名称、评分、评价人数、导演、主演、上映年份、国家 / 地区、类型等关键信息。本案例将使用 Python 编写爬虫&#xff0c;实现以下目标&#xff1a; 自动请求豆瓣电影 Top250 的 10 个分…

SPA安全警示:OAuth2.0致命漏洞

OAuth2.0在SPA应用中的安全陷阱SPA&#xff08;单页应用&#xff09;通常采用隐式授权&#xff08;Implicit Flow&#xff09;或PKCE&#xff08;Proof Key for Code Exchange&#xff09;授权模式&#xff0c;但存在以下安全隐患&#xff1a;隐式授权模式的漏洞访问令牌直接暴…

table表格字段明细展示

文章目录1、字段渲染2、异步请求展示明细3、hover展示问题3.1 基本逻辑3.2 hover时长判断3.3 renderhover表格字段明细展示&#xff0c;属于比较小的需求&#xff0c;但是也有一定交互细节&#xff0c;本文选取部分场景。 1、字段渲染 render和渲染组件是有区别的。render常见为…

主网上线后生态极速扩张的 Berachain 生态,有哪些值得关注的项目?

Berachain 是典型的将 DeFi 思维嵌入到共识机制中的 Layer1&#xff0c;其核心是 PoL&#xff08;Proof of Liquidity&#xff09;共识。PoL 要求验证者在获得区块奖励前&#xff0c;必须将流动性导入白名单协议&#xff0c;并由市场决定资金流向。这样&#xff0c;验证者的权重…