Spark RDD的转换

按颜色区分转换:

  • 绿色是单 RDD 窄依赖转换
  • 黑色是多 RDD 窄依赖转换
  • 紫色是 KV 洗牌型转换
  • 黄色是重分区转换
  • 蓝色是特例的转换

单 RDD 窄依赖转换

MapPartitionRDD

这个 RDD 在第一次分析中已经分析过。简单复述一下:

  • 依赖列表:一个窄依赖,依赖上游 RDD
  • 分区列表:上游 RDD 的分区列表
  • 计算流程:映射关系(输入一个分区,返回一个迭代器)
  • 分区器 :上游 RDD 的分区器
  • 存储位置:上游 RDD 的优先位置 可见除了计算流程,其他都是上游 RDD 的内容。
  1. map 传入一个带“值到值”转化函数的迭代器(例如字符串到字符串长度)
  2. mapPartitions 传入一个“迭代器到迭代器”的转化函数,如果需要按分区做一些比较重的过程(例如数据库连接等)
  3. flatMap 传入一个“迭代器到迭代器的迭代器”的转化函数(例如,统计字母,“字符串的迭代器”到“‘字符的迭代器’的迭代器”)
  4. filter 传入了一个带“值到布尔值”筛选函数的迭代器

PartitionwiseSampledRDD

在分区中采样的RDD

  • 分区列表:在上游的分区的基础上包装一个采样过程,形成一个新的分区PartitionwiseSampledRDDPartition
  • 计算流程:采样器返回的迭代器
  • 其他成分:与上游 RDD 相同 PartitionwiseSampledRDD,有放回的采样用泊松采样器,无放回的采样用伯努利采样器,传给分区器。

多 RDD 窄依赖

UnionRDD

  • 依赖列表:每个上游 RDD 一个RangeDependency,每个RangeDependency依赖上游 RDD 的所有分区
  • 分区列表:每个上游 RDD 一个UnionPartition,构成列表
  • 计算流程:获得目标分区的迭代器
  • 分区器 :None
  • 存储位置:每个上游 RDD 的优先位置

CartesianRDD

笛卡尔积,是两个 RDD 每个数据都进行一次关联。下文中两个 RDD 的关联中,两个 RDD 分别称为 rdd1、rdd2。

  • 依赖列表:两个窄依赖组成的数组,分别依赖 rdd1、rdd2
  • 分区列表:“rdd1的分区数 乘以 rdd2的分区数”个分区
  • 计算流程:rdd1的一条记录与 rdd2的一条记录合成元组
  • 分区器 :None
  • 存储位置:rdd1、rdd2的存储位置的积

洗牌型转换

洗牌型转换,是多个 RDD 关联的的转换。

CoGroupedRDD

多个源 RDD 依据 key 关联,key 相同的合并,形成最终的目标 RDD。

  • 依赖列表:每个源 RDD 一个依赖,构成列表。如果源 RDD 的分区器与目标的分区器相同,则是1-to-1依赖,如果不同,则是洗牌依赖
  • 分区列表:目标 RDD 分区器指定的分区数量个CoGroupPartition,每个分区记录了数据来源分区。其中如果是洗牌依赖的数据源,需要洗牌过程,具体洗牌过程以后再分析
  • 计算流程:返回一个迭代器,迭代对象是 key 和 key 对应源分区迭代器的数组 组成的元祖
  • 分区器 :目标 RDD 的分区器
  • 存储位置:None

ShuffledRDD

同样是多个源 RDD 依据 key 关联,key 相同的做排序或聚合运算,形成最终的目标 RDD。

  • 依赖列表:一个洗牌依赖,依赖所有上游 RDD
  • 分区列表:目标 RDD 分区器指定的分区数量个ShuffledRDDPartition,每个分区只有一个编号(因为每个上游分区)
  • 计算流程:洗牌过程,具体洗牌过程以后再分析
  • 分区器 :目标 RDD 的分区器
  • 存储位置:None

除了这五个成员以外,还有另外几个重要的成员:序列化器、key 排序器、聚合器、map 端合并器,他们都将用于洗牌

其他

  • coalesce,是减少分区数量,可以在过滤之后,使数据更集中,以提高效率
  • repartition,是重新分区,增加或减少分区数量,数据随机重新分配,可以消除分区间的数据量差异
  • pipe,是与外部程序管道关联,从外部程序中获取数据。

Scala语法

在 RDD.scala中,几乎每一个转换和操作函数都会有一个withScope,例如:

def map[U: ClassTag](f: T => U): RDD[U] = withScope {val cleanF = sc.clean(f)new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF))
}
def flatMap[U: ClassTag](f: T => TraversableOnce[U]): RDD[U] = withScope {val cleanF = sc.clean(f)new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.flatMap(cleanF))
}

withScope是一个函数,调用了RDDOperationScope.withScope方法:

private[spark] def withScope[U](body: => U): U = RDDOperationScope.withScope[U](sc)(body)

withScope就像是一个 AOP(面向切面编程),嵌入到所有RDD 的转换和操作的函数中,RDDOperationScope会把调用栈记录下来,用于绘制Spark UI的 DAG(有向无环图,可以理解为 Spark 的执行计划)。

我们用下面的代码简单演示一下 Scala 用函数做 AOP:

object Day1 {def main(args: Array[String]) = {Range(1,5).foreach(twice)println()Array("China", "Beijing", "HelloWorld").foreach(length)}def twice(i: Int): Int = aopPrint {i * 2}def length(s: String): Int = aopPrint {s.length}def aopPrint[U](i: => U): U = {print(i + " ")i}
}

aopPrint的 入参是“一个返回类型为U的函数”。这段程序中aopPrint就是一个模拟的切面,作用是把所有的函数返回值打印出来。结果是:

2 4 6 8 
5 7 10

从代码上看,aopPrint并没有降低代码的可读性。读者依然能很清楚地读懂twice和length函数。打印返回结果这个流程是独立于函数之外的切面。

结论

  1. RDD 的转换分图上几种
  2. RDD 的转换可以看成是产生新的 RDD,而新的 RDD 记录了每一个分区依赖上游的哪些分区、每个分区如何用上游分区计算而来

 

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

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

相关文章

日历管理:应对金融服务行业数据调度的复杂挑战

在当今快速发展的金融服务行业中,数据管理和调度的复杂性日益增加。在金融服务公司面临着多元化的挑战,这些挑战不仅涉及技术层面,还包括安全、运维和业务流程的优化。 日历管理在工作流调度中看似是一个较小的功能,但对于许多企业…

信息学奥赛一本通 1014:与圆相关的计算C语言非C++

1014&#xff1a;与圆相关的计算 #include <stdio.h>int main() {// 声明并定义圆周率为常量&#xff0c;其值为3.14159const double PI 3.14159;// 声明一个双精度浮点数变量double r;// 从输入读取一个值并赋给rscanf("%lf", &r);// 计算并打印圆的直径…

cmake的下载及安装

文章目录 下载安装 下载 cmake官网下载 进入 v3.22版本目录下。或者直接点击https://cmake.org/files/v3.22/进入&#xff0c;省略上面的步骤 浏览器上下载太慢&#xff0c;这里选择在Linux上通过wget方式下&#xff0c;不过下载速度也不是它快。主要是软件所在的服务器在国…

数据质量管理软件行业分析:2023年复合增长率达到31.9%

数据质量管理软件按照一般的功能模块划分可以划分为产品信息管理、存货管理、销售管理、采购管理、生产管理、设备管理、实验室管理、品质管理、售后管理等模块&#xff0c;质量管理绝非仅仅检验&#xff0c;或者常说的批检、巡检、首检、自检等&#xff0c;质量管理是对只要影…

Linux内核参数配置说明

Linux内核参数配置说明 一、引言 Linux内核参数是操作系统运行过程中的重要配置&#xff0c;它们决定了系统资源的管理方式、性能优化以及系统安全等方面的特性。本文将详细介绍Linux内核参数的配置说明&#xff0c;并给出CentOS 7推荐的内核参数设置。 二、Linux内核参数概…

串行计时芯片D1380/D1381,2.0V~5.5V 工作电流: 2V时 与TTL 兼容,采用DIP8、SOP8封装

D1380/D1381是一个带秒、分、时、日、日期、月、年的串行时钟保持芯片,每个月多少天以及闰年能自动调节, D1380/D1381低功耗工作方式, D1380/D1381用若干寄存器存储对应信息&#xff0c;一个32.768kHz 的晶振校准时钟&#xff0c;为了使用最小弓|脚&#xff0c;D1380/D1381使用…

论文润色会被认为是代写吗知乎 神码ai

大家好&#xff0c;今天来聊聊论文润色会被认为是代写吗知乎&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 标题&#xff1a;论文润色会被认为是代写吗――探讨论文润色与代写的关系 一、引言 在学术研…

微信小程序uni-app:常用Form表单组件input、textarea、picker使用示例

目录 input 输入框textarea多行输入框picker 选择器 input 输入框 https://developers.weixin.qq.com/miniprogram/dev/component/input.htmlhttps://uniapp.dcloud.net.cn/component/input.html <inputclass"input-class"type"text"v-model"val…

bugku -- 网站被黑--本地管理员

dirsearch 或者御剑扫目录 扫出来有个登录页面 然后bp抓包爆破密码 扫出来密码是heck登录就行了 构造x-forwarded-for:127.0.0.1 本地登录&#xff1a; 爆破账号 密码是text123 下面的base64解码可以知道

java swing 药品销售系统 mysql

数据库 查询药品&#xff1a; 出售药品&#xff1a; 查询客户信息&#xff1a; 查询订单信息&#xff1a;

3.Pandas高级函数应用

import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt # plt.style.use("bmh") plt.rc(font, familySimHei, size13) %matplotlib inlineimport warnings warnings.filterwarnings(ignore)pd.__version__2.1.11.1 函数应用…

【算法Hot100系列】两数相加

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

如何用ChatGPT分析恶意软件?

自从我们进入数字化时代以来&#xff0c;恶意软件就一直是计算机应用系统的“心腹大患”。事实上&#xff0c;每一次技术进步都会为恶意行为者提供更多的工具&#xff0c;使得他们的攻击行为更具破坏性。不过&#xff0c;如今生成式人工智能的崛起&#xff0c;似乎让一直以来的…

2023年【G3锅炉水处理】找解析及G3锅炉水处理模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 G3锅炉水处理找解析根据新G3锅炉水处理考试大纲要求&#xff0c;安全生产模拟考试一点通将G3锅炉水处理模拟考试试题进行汇编&#xff0c;组成一套G3锅炉水处理全真模拟考试试题&#xff0c;学员可通过G3锅炉水处理模…

【网络】简单聊一下 TIME_WAIT

问题背景 笔者在看自己服务状态数据的时候&#xff0c;会发现有很多 tcp 的连接&#xff0c;也会发现有很多处于不同状态下的 tcp 连接&#xff0c;TIME_WAIT 的连接数有83个&#xff0c;为了弄清楚这个 TIME_WAIT 是什么&#xff0c;整理了下面的笔记用于梳理概念 基础流程…

rocketmq window测试小Demo 解决找不到或无法加载主类的问题

文章目录 rocketMQ启动1.下在相关的二进制文件2.配置环境变量3.启动NameServer4.启动broker5. MQ 启动&#xff01;5.1 测试发送数据 6.关闭服务 rocketMQ启动 1.下在相关的二进制文件 下载地址&#xff0c;点击即达 2.配置环境变量 3.启动NameServer 在文件夹下执行cmd进…

vue项目 实现 vue-schart 图表 resize

项目中之前用了 vue-schart&#xff08;项目已经没人维护&#xff0c;很久不更新了&#xff09; GitHub - lin-xin/vue-schart: :bar_chart: Vue.js wrapper for sChart.js 没有resize功能&#xff0c;又不想修改源码&#xff0c;可以参考下边的方法实现&#xff1a; <tem…

Redis7--基础篇9(SpringBoot集成Redis)

1. jedis、lettuce、Redistemplate的关系 第一代为jedis&#xff0c;之后推出了lettuce&#xff0c;然后springboot继承了Redistemplate&#xff0c;现推荐使用Redistemplate。 总的来说&#xff0c;jedis、lettuce、Redistemplate都是java操作Redis数据库的驱动。 2. 本地Ja…

【精选小tips】Microsoft Edge最新版本关闭侧边栏快捷键

相信有很多小伙伴并不习惯使用Edge浏览器的侧边栏功能&#xff0c;感觉有点突兀&#xff0c;平时使用率又不是很高&#xff0c;想要将其关闭&#xff0c;但是&#xff01;&#xff01;&#xff01;Edge浏览器自动更新到120.0.2210.61版本后&#xff0c;居然在设置中之间没有了关…

深度学习(六):paddleOCR理解及识别手写体,手写公式,表格

1.介绍 1.1 什么是OCR? 光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;ORC是指对包含文本资料的图像文件进行分析识别处理&#xff0c;获取文字及版面信息的技术&#xff0c;检测图像中的文本资料&#xff0c;并且识别出文本的内容。…