Spark--如何理解RDD
1、概念
rdd是对数据集的逻辑表示,本身并不存储数据,只是封装了计算逻辑,并构建执行计划,通过保存血缘关系来记录rdd的执行过程和历史(当一个rdd需要重算时,系统会根据血缘关系追溯到最初的数据源,重建丢失的数据),调用行动算子时,会从数据源读取数据并进行计算。
2、五大属性
(1)compute计算函数
描述本RDD的数据如何被计算出来,本质上是运算逻辑的迭代器。
(2)依赖RDD列表
一个或多个前序RDD。
(3)分区列表
RDD被分成多个分区。
(4)(k, v)类型rdd的分区器
- 普通RDD:没有分区器,分区数在创建和Transformation时决定,后续可以通过repartition或coalesce修改。
- PairRDD:具有分区器的概念,可以基于键分区,常用于需要快速聚合的场景。
(5)每个分区的首选计算执行位置
为了提高计算效率,会根据数据本地化级别,将任务分配到离数据最近的计算节点进行计算。
3、本质
rdd的本质是迭代器。
迭代器是一种用于访问集合元素的设计模式,允许我们按需逐个访问集合中的元素,而无需一次性加载整个集合,允许一次仅访问一个元素,访问后可以前进到下一个元素,但无法返回上一个元素。
RDD在调用行动算子(如collect,count,reduce等)时,每个Task中会创建个独立的迭代器。
执行具体过程:
(1)分区:当使用RDD时,数据被分成多个分区,每个分区可以独立处理。
(2)任务调度:当行动算子被调用时,spark会为每个分区创建一个任务(Task)。
(3)创建迭代器:在每个Task开始执行时,Spark会为该分区的RDD创建一个迭代器,从而能够逐个访问该分区的数据。
(4)逐个处理:迭代器以惰性方式逐一处理元素,执行你所定义的操作;例如,映射、过滤、聚合等。
(5)结果汇总:在所有分区的Task完成后,Spark将结果汇总,并返回给驱动程序。
并行处理的优点:
(1)内存效率:每个Task只在内存中处理当前迭代器的数据,避免了同时加载整个RDD所需的数据。
(2)并行处理:每个Task可以在不同的Executor上并行执行,加快计速度。
(3)故障恢复:由于RDD的分区和迭代器的特性,Spark可以轻松地重算丢失的分区数据。
4、特点
(1)不可变性
一旦创建,rdd的内容就不能被修改了,可以通过转化操作创建一个新的rdd。
(2)弹性
可以在任务失败或数据丢失时,自动重算。
(3)支持分布计算
可以在整个集群中分布式地进行计算,支持大规模数据的处理。
5、RDD,DataFrame与DataSet的区别与联系
(1)RDD与DataFrame的区别
RDD中的数据没有结构信息,是一种基础的数据结构,主要使用函数式编程风格。
DataFrame是在RDD的基础上加上了一层schema,类似于表格的数据结构,有列名和数据类型的信息,提供了更加简洁的代码书写方式,支持SQL查询。

上图直观地体现了DataFrame和RDD的区别。左侧的RDD[Person]虽然以Person为类型参数,但Spark框架本身不了解Person类的内部结构。而右侧的DataFrame却提供了详细的结构信息,使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。DataFrame多了数据的结构信息,即schema。RDD是分布式的Java对象的集合。DataFrame是分布式的Row对象的集合。DataFrame除了提供了比RDD更丰富的算子以外,更重要的特点是提升执行效率、减少数据读取以及执行计划的优化,比如filter下推、裁剪等。
RDD:
val rdd = sc.parallelize(Seq(1, 2, 3, 4, 5))
val result = rdd.map(_ * 2).collect()
DataFrame:
val df = spark.read.json("path/to/json")
val result = df.filter($"age" > 20).select("name", "age")
(2)DataFrame与DataSet的区别
DataFrame 可以看作是 DataSet[Row],其中 Row 是一个通用的行类型。DataFrame可以认为是Dataset的一个特例,主要区别是DataSet每一个record存储的是一个强类型值而不是一个Row。
DataSet:
case class Person(name: String, age: Int)
val ds = spark.read.json("path/to/json").as[Person]
val result = ds.filter(_.age > 20).map(_.name)
6、宽RDD和窄RDD的概念
RDD在计算过程中,会被划分成多个Stage,这依靠的就是RDD之间的依赖关系。RDD有2种依赖关系(宽依赖和窄依赖),根据不同的依赖关系来确定是否需要shuffle,根据是否需要shuffle来确定是否需要划分stage。
(1)窄依赖(NarrowDependency)有如下两种:
① OneToOneDependency
父RDD的分区与子RDD的分区是一一对应的关系。
② RangeDependency
父RDD与子RDD是多对一的关系,但是父RDD的分区与子RDD的分区是一对一的关系,所以分区之间并不会交叉,每个子RDD依然对应父RDD的一个分区。

窄RDD分区间的计算是一对一的,每个子RDD只需要读取父RDD的一个分区即可进行计算,所以不需要shuffle,即不需要划分stage。
2、宽依赖:
ShuffleDependency

ShuffleDependency中,每个子RDD的每个分区,都要拿到父RDD的每个分区的数据,才能进行计算。正因如此,在遇到宽依赖时,需要对数据进行shuffle处理,划分stage。
相关文章:
Spark--如何理解RDD
1、概念 rdd是对数据集的逻辑表示,本身并不存储数据,只是封装了计算逻辑,并构建执行计划,通过保存血缘关系来记录rdd的执行过程和历史(当一个rdd需要重算时,系统会根据血缘关系追溯到最初的数据源ÿ…...
CTFSHOW-WEB入门-PHP特性89-100
题目:web 89 题目:解题思路:这道题目涉及了两个函数:preg_match()和intval()简要介绍一下两个函数 preg_match()用于对字符串进行正则表达式的匹配࿰…...
[250204] Mistral Small 3:小巧、快速、强大 | asdf 0.16.0 发布:Golang 重写带来性能飞跃
目录 Mistral AI 发布开源模型 Mistral Small 3:小巧、快速、强大asdf 0.16.0 版本发布:Golang 重写带来性能飞跃! Mistral AI 发布开源模型 Mistral Small 3:小巧、快速、强大 法国人工智能初创公司 Mistral AI 发布了最新的开源…...
PySpark学习笔记5-SparkSQL
sparkSql的数据抽象有两种。 一类是data set适用于java和Scala 一类是data frame适用于java,Scala,python 将r d d转换为data frame #方式一 df spark.createDataFrame(rdd,schema[name,age]) #方式二 schema Structtype(). add(id,integertype(),nu…...
windows版的docker如何使用宿主机的GPU
windows版的docker使用宿主机的GPU的命令 命令如下 docker run -it --nethost --gpus all --name 容器名 -e NVIDIA_DRIVER_CAPABILITIEScompute,utility -e NVIDIA_VISIBLE_DEVICESall 镜像名效果 (transformer) rootdocker-desktop:/# python Python 3.9.0 (default, Nov 15 …...
Python爬虫:1药城店铺爬虫(完整代码)
⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…...
代码随想录算法训练营打卡第55天:并查集相关问题;
Java并查集的模板 //并查集模板 class DisJoint{private int[] father;public DisJoint(int N) {father new int[N];for (int i 0; i < N; i){father[i] i;}}public int find(int n) {return n father[n] ? n : (father[n] find(father[n]));}public void join (int …...
K8S学习笔记-------1.安装部署K8S集群环境
1.修改为root权限 #sudo su 2.修改主机名 #hostnamectl set-hostname k8s-master01 3.查看网络地址 sudo nano /etc/netplan/01-netcfg.yaml4.使网络配置修改生效 sudo netplan apply5.修改UUID(某些虚拟机系统,需要设置才能生成UUID)#…...
云原生周刊:K8s引领潮流
开源项目推荐 KWOK KWOK(Kubernetes WithOut Kubelet)是一个开源项目,旨在提供一个轻量级的 K8s 集群模拟环境,允许用户在不依赖真实节点的情况下,本地模拟整个 K8s 集群。它通过模拟 Kubelet 和其他集群组件的行为&…...
C_位运算符及其在单片机寄存器的操作
C语言的位运算符用于直接操作二进制位,本篇简单结束各个位运算符的作业及其在操作寄存器的应用场景。 一、位运算符的简单说明 1、按位与运算符(&) 功能:按位与运算符对两个操作数的每一位执行与操作。如果两个对应的二进制…...
【算法篇】贪心算法
目录 贪心算法 贪心算法实际应用 一,零钱找回问题 二,活动选择问题 三,分数背包问题 将数组和减半的最小操作次数 最大数 贪心算法 贪心算法,是一种在每一步选择中都采取当前状态下的最优策略,期望得到全局最优…...
Selenium 浏览器操作与使用技巧——详细解析(Java版)
目录 一、浏览器及窗口操作 二、键盘与鼠标操作 三、勾选复选框 四、多层框架/窗口定位 五、操作下拉框 六、上传文件操作 七、处理弹窗与 alert 八、处理动态元素 九、使用 Selenium 进行网站监控 前言 Selenium 是一款非常强大的 Web 自动化测试工具,能够…...
ioDraw桌面版 v3.4.0发布!AI文生图,AI图生图,手绘风格一键转换!
流程图功能升级 AI 文生图: 用户现在能输入文字描述,让软件自动生成对应的流程图画面,减少了手动绘图的工作量,提高创作效率,比如输入 “项目开发流程”,软件可能就会生成包含需求分析、设计、开发、测试…...
深入理解Node.js_架构与最佳实践
1. 引言 1.1 什么是Node.js Node.js简介:Node.js是一个基于Chrome V8引擎的JavaScript运行时,用于构建快速、可扩展的网络应用。Node.js的历史背景和发展:Node.js最初由Ryan Dahl在2009年发布,旨在解决I/O密集型应用的性能问题。随着时间的推移,Node.js社区不断壮大,提供…...
安装和卸载RabbitMQ
我的飞书:https://rvg7rs2jk1g.feishu.cn/docx/SUWXdDb0UoCV86xP6b3c7qtMn6b 使用Ubuntu环境进行安装 一、安装Erlang 在安装RabbitMQ之前,我们需要先安装Erlang,RabbitMQ需要Erlang的语言支持 #安装Erlang sudo apt-get install erlang 在安装的过程中,会弹出一段信息,此…...
第27节课:安全审计与防御—构建坚固的网络安全防线
目录 安全审计工具与流程安全审计工具NessusNmapBurp Suite 安全审计流程规划与准备信息收集漏洞扫描分析与评估报告与建议 安全防御策略网络层防御应用层防御数据层防御安全管理 结语 在当今数字化时代,网络安全已成为企业和个人不可忽视的重要议题。随着网络攻击手…...
【蓝桥杯】日志统计
日志统计(编程题)https://dashoj.com/d/lqbproblem/p/53https://dashoj.com/d/lqbproblem/p/53https://dashoj.com/d/lqbproblem/p/53 题目 日志统计(编程题) 讲解 这个讲解感觉比较通俗易懂。 蓝桥杯2018年省赛B组08(c/c)日…...
23.Word:小王-制作公司战略规划文档❗【5】
目录 NO1.2.3.4 NO5.6 NO7.8.9 NO10.11 NO12 NO13.14 NO1.2.3.4 布局→页面设置对话框→纸张:纸张大小:宽度/高度→页边距:上下左右→版式:页眉页脚→文档网格:勾选只指定行网格✔→ 每页:…...
基于单片机的智能安全插座(论文+源码)
1 系统整体方案设计 本课题基于单片机的智能安全插座设计,以STM32嵌入式单片机为主体,将计算机技术和检测技术有机结合,设计一款电量参数采集装置,实现电压、电流信号的数据采集任务,电压、电流和功率在上位机的显示任…...
2025年人工智能技术:Prompt与Agent的发展趋势与机遇
文章目录 一、Prompt与Agent的定义与区别(一)定义(二)区别二、2025年Prompt与Agent的应用场景(一)Prompt的应用场景(二)Agent的应用场景三、2025年Prompt与Agent的适合群体(一)Prompt适合的群体(二)Agent适合的群体四、2025年Prompt与Agent的发展机遇(一)Prompt的…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
