【笔记】RDD算子操作(Spark基础知识)

news2024/9/22 5:43:36

持续更新中!!!

目录

一、RDD的创建

1.从本地创建

(1)本地文件

(2)hdfs文件(先提前创建目录并上传文件)

2.从集合创建(通过并行集合(列表)创建RDD)

二、RDD的写回

三、转换操作(Transformation)

1.filter(func)

2.map(func)

3.flatMap(func)

4.groupByKey()

5.reduceByKey(func)

6.join()

7.subtractByKey()

8.distinct()

9.union()、intersection()、subtract()

四、行动操作(Action)

​编辑1.count()

2.collect()

3.first()

4.take(n)

5.reduce(func)

6.foreach(func)

五、持久化

六、RDD分区

七、键值对RDD(转换操作)

1.reduceByKey(func)

2.groupByKey()

3.keys()

4.values()

5.sortByKey()

6.mapValues(func)

7.join()

8.combineByKey()


一、RDD的创建

从文本、JSON、SequenceFile、分布式文件系统、集合、数据库等创建

1.从本地创建

(1)本地文件

sc.textFile(file:///     )  (这一步是转换操作,只记录不执行,所以如果是一个不存在的文件也不会报错,只有在执行执行操作时才报错)
例:
>>> rdd=sc.textFile("file:///home/hadoop/sparksj/word.txt")
>>> rdd.foreach(print)
Spark is better
Hadoop is good
Spark is fast

(2)hdfs文件(先提前创建目录并上传文件)

sc.textFile("地址")    例:sc.textFile("/usr/hadoop/     ")
>>> rdd = sc.textFile("hdfs://localhost:9000/user/hadoop/word.txt")
>>> rdd = sc.textFile("/user/hadoop/word.txt")
>>> rdd = sc.textFile("word.txt")
三条语句是完全等价的,可以使用其中任意一种方式


注意

1.可以从多个数据集文件中通过读取文件夹来读取多个文件
例如:在home/hadoop/sparksj/mycode目录下有多个文件,读取其中的所有文件
>>> rdd2=sc.textFile("file:///home/hadoop/sparksj/mycode")

2.可以读取多种类型的数据
>>> rdd2=sc.textFile("file:///home/hadoop/sparksj/people.json")
>>> rdd2.foreach(print)
{"name":"Justin", "age":19}
{"name":"Michael"}
{"name":"Andy", "age":30}
3.lambda表达式
>>> rdd3=rdd2.filter(lambda line:"Andy" in line)    (filter(func):过滤,从所给数据集中所有数据中过滤出来,即筛选出满足函数func的元素,并返回一个新的数据集)
>>> rdd3.foreach(print)
{"name":"Andy", "age":30}

2.从集合创建(通过并行集合(列表)创建RDD)

调用SparkContext的parallelize方法,在Driver中一个已经存在的集合(列表)上创建:

>>> a = [1,2,3,4,5]
>>> rdd = sc.parallelize(a)
>>> rdd.foreach(print)
3
2
4
5
1
>>> rdd.collect()
[1, 2, 3, 4, 5]
>>> rdd.reduce(lambda a,b:a+b)    (求和)
15

>>> b=["Spark","bbb","MongoDB","Spark"]
>>> rdd2=sc.parallelize(b)
>>> rdd2.foreach(print)
Spark
MongoDB
bbb
Spark

二、RDD的写回

写回本地:数据集.saveAsTextFile("file:///    ")
写回HDFS:数据集.saveAsTextFile("/user/hadoop/       或直接是文件名")        #同写入文件一样,三条语句
 

三、转换操作(Transformation

对于RDD而言,每一次转换操作都会产生不同的RDD,供给下一个“转换”使用

转换得到的RDD是惰性求值的,也就是说,整个转换过程只是记录了转换的轨迹,并不会发生真正的计算,只有遇到行动操作时,才会发生真正的计算,开始从血缘关系源头开始,进行物理的转换操作

转换操作并不会产生真正的计算,所以说需要把转换后的内容赋值给对象,而行为操作则不需要赋值给对象,直接执行。

(每一个func都是一个匿名函数)

1.filter(func)

筛选出满足函数func的元素,并返回一个新的数据集

例:rdd3=rdd2.filter(lambda line:"Andy" in line) 

2.map(func)

每个元素传递到函数func中,并将结果返回为一个新的数据集

例:>>> rdd3=rdd2.map(lambda x:(x,1))            #转换为键值对
>>> rdd3.foreach(print)
('Spark', 1)
('bbb', 1)
('Spark', 1)
('MongoDB', 1)

3.flatMap(func)

与map()相似,但每个输入元素都可以映射到0或多个输出结果

map(func)与flatMap(func)的区别:把map()操作得到的数据集中的每个元素“拍扁”(flat),就得到了flatMap()操作的结果

>>> rdd=sc.textFile("file:///home/hadoop/sparksj/word.txt")
>>> rdd1=rdd.map(lambda line:line.split(" "))                #split(" "):按空格分隔
>>> rdd1.foreach(print)
['Hadoop', 'is', 'good']
['Spark', 'is', 'fast']
['Spark', 'is', 'better']
>>> rdd2=rdd.flatMap(lambda line:line.split(" "))
>>> rdd2.foreach(print)
Spark
is
better
Hadoop
is
good
Spark
is
fast
>>> rdd3=rdd2.map(lambda x:(x,1))                #变成键值对
>>> rdd3.foreach(print)
('Spark', 1)
('is', 1)
('better', 1)
('Hadoop', 1)
('is', 1)
('good', 1)
('Spark', 1)
('is', 1)
('fast', 1)
>>> rdd4=rdd1.map(lambda x:(x,1))
>>> rdd4.foreach(print)
(['Spark', 'is', 'better'], 1)
(['Hadoop', 'is', 'good'], 1)
(['Spark', 'is', 'fast'], 1)

4.groupByKey()

应用于(K,V)键值对的数据集时,返回一个新的(K, Iterable)形式的数据集

例:>>> rdd5=rdd3.groupByKey()
>>> rdd5.foreach(print)
('is', <pyspark.resultiterable.ResultIterable object at 0x7fe2ce9e5900>)
('good', <pyspark.resultiterable.ResultIterable object at 0x7fe2ce9e76d0>)
('Spark', <pyspark.resultiterable.ResultIterable object at 0x7fe2ce9e5900>)
('Hadoop', <pyspark.resultiterable.ResultIterable object at 0x7fe2ce9e5900>)
('fast', <pyspark.resultiterable.ResultIterable object at 0x7fe2ce9e76d0>)
('better', <pyspark.resultiterable.ResultIterable object at 0x7fe2ce9e5900>)
即变成("is",(1,1,1))

5.reduceByKey(func)

应用于(K,V)键值对的数据集时,返回一个新的(K, V)形式的数据集,其中每个值是将每个key传递到函数func中进行聚合后的结果

例:>>> rdd6=rdd3.reduceByKey(lambda a,b:a+b)                #词频统计
>>> rdd6.foreach(print)
('Hadoop', 1)
('fast', 1)
('better', 1)
('is', 3)
('good', 1)
('Spark', 2)

6.join()

join就表示内连接。对于内连接,对于给定的两个输入数据集(K,V1)和(K,V2),只有在两个数据集中都存在的key才会被输出,最终得到一个(K,(V1,V2))类型的数据集

>>> rdd1=sc.parallelize([(1001,"zhangsan"),(1002,"lisi"),(1003,"wangwu")])
>>> rdd2=sc.parallelize([(1001,"student"),(1002,"teather")])
>>> rdd1.join(rdd2).collect()
[(1001, ('zhangsan', 'student')), (1002, ('lisi', 'teather'))]
>>> rdd1.leftOuterJoin(rdd2).collect()            #左外连接
[(1001, ('zhangsan', 'student')), (1002, ('lisi', 'teather')), (1003, ('wangwu', None))]
>>> rdd1.rightOuterJoin(rdd2).collect()        #右外连接
[(1001, ('zhangsan', 'student')), (1002, ('lisi', 'teather'))]
>>> rdd1.fullOuterJoin(rdd2).collect()            #全连接
[(1001, ('zhangsan', 'student')), (1002, ('lisi', 'teather')), (1003, ('wangwu', None))]

7.subtractByKey()

删掉 RDD1 中键与 RDD2 中的键相同的元素

>>> rdd1.subtractByKey(rdd2).collect()
[(1003, 'wangwu')]

8.distinct()

去重

>>> r1=sc.parallelize([1,2,2,3,3,3])
>>> r1.distinct().collect()
[1, 2, 3]

9.union()、intersection()、subtract()

>>> r1=sc.parallelize([1,2,3])        #键值对同理
>>> r2=sc.parallelize([1,2,4,5,6])
>>> r12=r1.union(r2)        #并集
>>> r12.collect()
[1, 2, 3, 1, 2, 4, 5, 6]
>>> r21=r1.intersection(r2)        #交集
>>> r21.collect()
[1, 2]
>>> r121=r1.subtract(r2)        #差集
>>> r121.collect()
[3]

四、行动操作(Action)

行动操作是真正触发计算的地方。Spark程序执行到行动操作时,才会执行真正的计算,从文件中加载数据,完成一次又一次转换操作,最终,完成行动操作得到结果。


1.count()

返回数据集中的元素个数

2.collect()

数组的形式返回数据集中的所有元素

3.first()

返回数据集中的第一个元素

4.take(n)

以数组的形式返回数据集中的前n个元素

5.reduce(func)

通过函数func(输入两个参数并返回一个值)聚合数据集中的元素

6.foreach(func)

将数据集中的每个元素传递到函数func中运行


>>> rdd=sc.textFile("file:///home/hadoop/sparksj/word.txt")
>>> rdd.count()
3
>>> rdd.collect()
['Hadoop is good', 'Spark is fast', 'Spark is better']
>>> rdd.first()
'Hadoop is good'
>>> rdd.take(2)
['Hadoop is good', 'Spark is fast']
>>> rdd.reduce(lambda a,b:a+b)
'Hadoop is goodSpark is fastSpark is better'
>>> rdd.foreach(print)
Spark is better
Hadoop is good
Spark is fast


练习:

>>> rdd=sc.textFile("file:///home/hadoop/sparksj/y.txt")
>>> rdd.foreach(print)
one,two,two,three,three,three
>>> rdd1=rdd.flatMap(lambda line: line.split(","))
>>> rdd2=rdd1.map(lambda x:(x,1))
>>> rdd2.foreach(print)
('one', 1)
('two', 1)
('two', 1)
('three', 1)
('three', 1)
('three', 1)
>>> rdd3=rdd2.reduceByKey(lambda a,b:a+b)
>>> rdd3.foreach(print)
('one', 1)
('two', 2)
('three', 3)
>>> rdd4=rdd1.map(lambda s:len(s))
>>> rdd4.foreach(print)
3
3
3
5
5
5
>>> rdd4.reduce(lambda a,b:a+b)
24
>>> rdd5=rdd1.map(lambda x:"BigData:"+x)
>>> rdd5.foreach(print)
BigData:one
BigData:two
BigData:two
BigData:three
BigData:three
BigData:three

>>> rdd6=sc.parallelize([2,6,1,4,8])
>>> rdd7=rdd6.map(lambda x:x+10)
>>> rdd7.collect()
[12, 16, 11, 14, 18]
>>> rdd7.filter(lambda x:x>15).collect()
[16, 18]

五、持久化

在了解持久化之前先了解什么是惰性机制

所谓的“惰性机制”是指,整个转换过程只是记录了转换的轨迹,并不会发生真正的计算,只有遇到行动操作时,才会触发“从头到尾”的真正的计算

持久化:

在Spark中,RDD采用惰性求值的机制,每次遇到行动操作,都会从头开始执行计算。每次调用行动操作,都会触发一次从头开始的计算。这对于迭代计算而言,代价是很大的,迭代计算经常需要多次重复使用同一组数据

  • 可以通过持久化(缓存)机制避免这种重复计算的开销
  • 可以使用persist()方法对一个RDD标记为持久化
  • 之所以说“标记为持久化”,是因为出现persist()语句的地方,并不会马上计算生成RDD并把它持久化,而是要等到遇到第一个行动操作触发真正计算以后,才会把计算结果进行持久化
  • 持久化后的RDD将会被保留在计算节点的内存中被后面的行动操作重复使用


persist()的圆括号中包含的是持久化级别参数:

  • persist(MEMORY_ONLY):表示将RDD作为反序列化的对象存储于JVM中,如果内存不足,就要按照LRU原则替换缓存中的内容(只持久化到内存)
  • persist(MEMORY_AND_DISK)表示将RDD作为反序列化的对象存储在JVM中,如果内存不足,超出的分区将会被存放在硬盘上
  • 一般而言,使用cache()方法时,会调用persist(MEMORY_ONLY)
  • 可以使用unpersist()方法手动地把持久化的RDD从缓存中移除

六、RDD分区

RDD是弹性分布式数据集,通常RDD很大,会被分成很多个分区,分别保存在不同的节点上

分区的作用 :(1)增加并行度        (2)减少通信开销

  • 分区是RDD数据存储的最小单位
  • RDD所有的操作都会作用在所有的分区之上

在调用textFile()和parallelize()方法的时候手动指定分区个数即可,语法格式如下: sc.textFile(path, partitionNum)        其中,path参数用于指定要加载的文件的地址,partitionNum参数用于指定分区个数。

>>> r1=sc.parallelize([1,2,3,4,5,6],3)                #设置三个分区
>>> r1.glom().collect()                #显示r1中三个分区的内容
[[1, 2], [3, 4], [5, 6]]                                                        
>>> len(r1.glom().collect())                #显示r1这个RDD的分区数量
3
>>> r1.map(lambda x:x+10).glom().collect()
[[11, 12], [13, 14], [15, 16]]

使用reparititon方法(重分区)重新设置分区个数:

>>> data = sc.parallelize([1,2,3,4,5],2)
>>> len(data.glom().collect())                #显示data这个RDD的分区数量
2
>>> rdd = data.repartition(1)                #对data这个RDD进行重新分区
>>> len(rdd.glom().collect())                #显示rdd这个RDD的分区数量
1

思考:

rdd1=sc.parallelize(range(10),3)
print(rdd1.glom().collect())
r2=rdd1.reduce(lambda x,y:x-y)
print(r2)

写出结果,并解释
输出:[[0, 1, 2], [3, 4, 5], [6, 7, 8, 9]]
21
解释:(0-1-2)-(3-4-5)-(6-7-8-9)=-3+6+18=21

七、键值对RDD(转换操作)

1.reduceByKey(func)

使用func函数合并具有相同键的值(见三、转换操作(Transformation)中5.reduceByKey(func))

2.groupByKey()

对具有相同键的值进行分组(同三、转换操作(Transformation)中4.groupByKey())

比如,对四个键值对("spark",1)、("spark",2)、("hadoop",3)和("hadoop",5),采用groupByKey()后得到的结果是:("spark",(1,2))和("hadoop",(3,5))

3.keys()

keys只会把Pair RDD(一个键值对(key-value pairs)的RDD)中的key返回形成一个新的RDD

4.values()

values只会把Pair RDD中的value返回形成一个新的RDD

5.sortByKey()

返回一个根据键排序的RDD

6.mapValues(func)

对键值对RDD中的每个value都应用一个函数,但是,key不会发生变化

7.join()

join就表示内连接。对于内连接,对于给定的两个输入数据集(K,V1)和(K,V2),只有在两个数据集中都存在的key才会被输出,最终得到一个(K,(V1,V2))类型的数据集

8.combineByKey()

自定义对每个键的值进行聚合的方式

>>> r1=sc.parallelize([("Spark",10),("Bigdata",5),("Flink",3)])
>>> r1.foreach(print)
('Spark', 10)
('Bigdata', 5)
('Flink', 3)
>>> r1.keys().collect()                #输出键(collect():列表形式)
['Spark', 'Bigdata', 'Flink']
>>> r1.values().collect()                #输出值(列表形式)
[10, 5, 3]

>>> r1.sortByKey().collect()                #sortByKey()按键排序(默认升序:B,F,S)
[('Bigdata', 5), ('Flink', 3), ('Spark', 10)]
>>> r1.sortByKey(False).collect()                #按键降序排序
[('Spark', 10), ('Flink', 3), ('Bigdata', 5)]
>>> r1.sortBy(lambda x:x).collect()                #sortBy()默认按键升序排序
[('Bigdata', 5), ('Flink', 3), ('Spark', 10)]
>>> r1.sortBy(lambda x:x,False).collect()                #按键降序排序
[('Spark', 10), ('Flink', 3), ('Bigdata', 5)]
>>> r1.sortBy(lambda x:x[0],False).collect()                #x[0],False指定按键降序排序
[('Spark', 10), ('Flink', 3), ('Bigdata', 5)]
>>> r1.sortBy(lambda x:x[1],False).collect()                #x[1],False指定按值降序排序
[('Spark', 10), ('Bigdata', 5), ('Flink', 3)]
>>> r1.sortBy(lambda x:x[1],True).collect()                #x[1],True指定按值升序排序
[('Flink', 3), ('Bigdata', 5), ('Spark', 10)]

>>> r1.mapValues(lambda x:x+1).collect()                #mapValues对键值对RDD中的每个value都应用一个函数,但是,key不会发生变化
[('Spark', 11), ('Bigdata', 6), ('Flink', 4)]
 

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

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

相关文章

C#手术麻醉信息系统全套商业源码,自主版权,支持二次开发 医院手麻系统源码

手术麻醉信息系统是HIS产品的中的一个组成部分&#xff0c;主要应用于医院的麻醉科&#xff0c;属于电子病历类产品。医院麻醉监护的功能覆盖整个手术与麻醉的全过程&#xff0c;包括手术申请与排班、审批、安排、术前、术中和术后的信息管理提供支持。 手术麻醉信息系统可与EM…

MTK8781安卓核心板_MT8781(Helio G99)核心板性能参数

MT8781安卓核心板搭载了八核CPU&#xff0c;其中包括两个主频高达2.2GHz的高性能Arm Cortex-A76处理器。这一处理器采用了台积电6纳米级芯片生产工艺&#xff0c;以及先进的3D图形功能的高性能Arm Mali G57级GPU。通过超快LPDDR4X内存和UFS 2.2存储供电&#xff0c;不仅提高了游…

springdata框架对es集成

什么是spring data框架 Spring Data是一个用于简化数据库、非关系型数据库、索引库访问&#xff0c;并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷&#xff0c;并支持 map-reduce框架和云计算数据服务。Spring Data可以极大的简化JPA(Elasticsearch…)的…

【TB作品】MSP430G2553,超声波倒车雷达PCB,单片机,超声波SR04,键盘,oled,

题目 硬件&#xff1a;MSP430G2553、 SR04超声波传感器 、3*4键盘、 无源蜂鸣器、oled显示屏 软件 1 、实时显示测量得到的距离 2、按键设置一个报警门限数值&#xff0c;直接输入数值后确认 3、低于报警门限数值就开始报警&#xff0c;而且距离越近蜂鸣器的鸣叫频率越高 程序…

电脑突然死机怎么办?

死机是电脑常见的故障问题&#xff0c;尤其是对于老式电脑来说&#xff0c;一言不合电脑画面就静止了&#xff0c;最后只能强制关机重启。那么你一定想知道是什么原因造成的吧&#xff0c;一般散热不良最容易让电脑死机&#xff0c;还有系统故障&#xff0c;比如不小心误删了系…

MySQL count(*/column)查询优化

count()是SQL中一个常用的聚合函数&#xff0c;其被用来统计记录的总数&#xff0c;下面通过几个示例来说明此类查询的注意事项及应用技巧。 文章目录 一、count()的含义二、count()的应用技巧2.1 同时统计多列2.2 利用执行计划 一、count()的含义 count()用于统计符合条件的记…

Yarn简介及Windows安装与使用指南

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

STM32使用USART发送数据包指令点亮板载LED灯

电路连接&#xff1a; 连接显示屏模块&#xff0c;显示屏的SCL在B10&#xff0c;SDA在B11。 程序目的&#xff1a; 发送LED_ON指令打开板载LED灯&#xff0c;发送LED_OFF关闭板载LED灯&#xff0c;与上一个博客不同&#xff0c;这个实际上是实现串口收发文本数据包。 …

flink on yarn-per job源码解析、flink on k8s介绍

Flink 架构概览–JobManager JobManager的功能主要有: 将 JobGraph 转换成 Execution Graph,最终将 Execution Graph 拿来运行Scheduler 组件负责 Task 的调度Checkpoint Coordinator 组件负责协调整个任务的 Checkpoint,包括 Checkpoint 的开始和完成通过 Actor System 与 …

【MySQL】6.MySQL主从复制和读写分离

主从复制 主从复制与读写分离 通常数据库的读/写都在同一个数据库服务器中进行&#xff1b; 但这样在安全性、高可用性和高并发等各个方面无法满足生产环境的实际需求&#xff1b; 因此&#xff0c;通过主从复制的方式同步数据&#xff0c;再通过读写分离提升数据库的并发负载…

Day54:WEB攻防-XSS跨站Cookie盗取表单劫持网络钓鱼溯源分析项目平台框架

目录 XSS跨站-攻击利用-凭据盗取 XSS跨站-攻击利用-数据提交 XSS跨站-攻击利用-flash钓鱼 XSS跨站-攻击利用-溯源综合 知识点&#xff1a; 1、XSS跨站-攻击利用-凭据盗取 2、XSS跨站-攻击利用-数据提交 3、XSS跨站-攻击利用-网络钓鱼 4、XSS跨站-攻击利用-溯源综合 漏洞原理…

深度学习理解及学习推荐(持续更新)

主推YouTuBe和Bilibili 深度学习博主推荐&#xff1a; Umar Jamil - YouTubehttps://www.youtube.com/umarjamilai StatQuest with Josh Starmer - YouTubehttps://www.youtube.com/statquest RNN Illustrated Guide to Recurrent Neural Networks: Understanding the Int…

知乎:多云架构下大模型训练,如何保障存储稳定性?

知乎&#xff0c;中文互联网领域领先的问答社区和原创内容平台&#xff0c;2011 年 1 月正式上线&#xff0c;月活跃用户超过 1 亿。平台的搜索和推荐服务得益于先进的 AI 算法&#xff0c;数百名算法工程师基于数据平台和机器学习平台进行海量数据处理和算法训练任务。 为了提…

生成式 AI 学习资源大汇总

这里汇聚了该领域的海量学习资源&#xff0c;从研究更新到面试技巧&#xff0c;从课程材料到免费课程&#xff0c;还有实用代码&#xff0c;一应俱全&#xff0c;是你工作流程中的得力助手&#xff01; 前沿研究&#xff1a;每月精心筛选的最佳生成式 AI 论文列表&#xff0c;让…

Flink集群主节点JobManager启动分析

1.概述 JobManager 是 Flink 集群的主节点&#xff0c;它包含三大重要的组件&#xff1a; ResourceManager Flink集群的资源管理器&#xff0c;负责slot的管理和申请工作。 Dispatcher 负责接收客户端提交的 JobGraph&#xff0c;随后启动一个Jobmanager&#xff0c;类似 Yarn…

C#全新一代医院手术麻醉系统围术期全流程源码

目录 一、麻醉学科的起源 二、麻醉前访视与评估记录单 患者基本信息 临床诊断 患者重要器官功能及疾病情况 病人体格情况分级 手术麻醉风险评估 拟施麻醉方法及辅助措施 其他需要说明的情况 访视麻醉医师签名 访视时间 与麻醉相关的检查结果 三、手术麻醉信息系统…

蓝桥杯单片机快速开发笔记——PCF8591的DAC模拟电压输出

一、原理分析 PCF8591电压信号探测器&#xff1a;http://t.csdnimg.cn/R38tC IIC原理&#xff1a;http://t.csdnimg.cn/v4dSv IIC指令&#xff1a;http://t.csdnimg.cn/RY6yi HC573/HC138&#xff1a;http://t.csdnimg.cn/W0a0U 数码管&#xff1a;http://t.csdnimg.cn/kfm9Y 独…

jmeter总结之:Regular Expression Extractor元件

Regular Expression Extractor是一个后处理器元件&#xff0c;使用正则从服务器的响应中提取数据&#xff0c;并将这些数据保存到JMeter变量中&#xff0c;以便在后续的请求或断言中使用。在处理动态数据或验证响应中的特定信息时很有用。 添加Regular Expression Extractor元…

实时数仓之实时数仓架构(Hudi)

目前比较流行的实时数仓架构有两类&#xff0c;其中一类是以FlinkDoris为核心的实时数仓架构方案&#xff1b;另一类是以湖仓一体架构为核心的实时数仓架构方案。本文针对FlinkHudi湖仓一体架构进行介绍&#xff0c;这套架构的特点是可以基于一套数据完全实现Lambda架构。实时数…

20232831 2023-2024-2 《网络攻防实践》第4次作业

目录 20232831 2023-2024-2 《网络攻防实践》第4次作业1.实验内容2.实验过程&#xff08;1&#xff09;ARP缓存欺骗攻击&#xff08;2&#xff09;ICMP重定向攻击&#xff08;3&#xff09;SYN Flood攻击&#xff08;4&#xff09;TCP RST攻击&#xff08;5&#xff09;TCP会话…