Spark 基础操作

Spark 操作

创建操作(Creation Operation)

用于RDD创建工作。RDD创建只有两种方法,一种是来自于内存集合和外部存储系统,另一种是通过转换操作生成的RDD

转换操作(Transformation Operation)

将RDD通过一定的操作变成新的RDD,比如HadoopRDD可以使用map操作变换为MappedRDD

RDD的转换操作是惰性操作,它只是定义了一个新的RDDs,并没有立即执行

控制操作(Control Operation)

进行RDD持久化,可以让RDD按不同的存储策略保存在磁盘或内存中,比如cache接口默认将RDD缓存在内存中

行动操作(Action Operation)

能够触发Spark运行的操作,例如,对RDD进行collect就是行动操作

Spark中行动操作分为两类,一类的操作结果变成Scala集合或者变量,另一类将RDD保存到外部文件系统或者数据库中

创建操作

parallelize[T](seq:Seq[T], numSlices:Int)

parallelize 在一个已经存在的Scala集合上创建(一个Seq对象)。集合的对象将会被复制,创建出一个可以被并行操作的分布式数据集

makeRDD[T](seq:Seq[(T, Seq[String])]):RDD[T]

并行化集合创建操作

基础转换操作

map[U](f:(T) => U):RDD[U]

map操作是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD,任何原RDD中的元素在新RDD中都有且只有一个元素与之对应

distinct():RDD[(T)]/distinct(nPartitions):RDD[(T)]

distinct操作是去除RDD重复的元素,返回所有元素不重复RDD

flatMap[U](f:(T) => TraversableOnce[U]):RDD[U]

flatMap操作与map类似,区别是原RDD中的每个元素经过map处理后只能生成一个元素,而在flatMap操作中原RDD中的每个元素可生成一个或多个元素来构建RDD

coalesce(numPartitions:Int,shuffle:Boolean = false):RDD[T]

coalesce操作使用HashPartitioner进行重分区,第一个参数为重分区的数目,第二个是否进行shuffle,默认情况为false

repartition(numPartitions:Int):RDD[T]

repartition操作是coalesce函数第二个参数为true的实现

randomSplit(weights:Array[Double], send:Long):Array[RDD[T]]

randomSplit操作是根据weights权重将一个RDD分隔为多个RDD

glom():RDD[Array[T]]

glom操作则是RDD中每一个分区所有类型为T的数据转变成元素为T的数组[Array[T]]

union(other:RDD[T]):RDD[T]

union操作是将两个RDD合并,返回两个RDD的并集,返回元素不去重

intersection(other:RDD[T]):RDD[T]

intersection操作类似SQL中的inner join操作,返回两个RDD交集,返回元素去重

subtract(other:RDD[T]):RDD[T]

subtract 返回在RDD中出现,且不在otherRDD中出现的元素

mapPartitions[U](f:(Iter), preserversPartitons:Boolean)

mapPartitions操作和map操作类似,只不过映射的参数由RDD中的每一个元素变成了RDD中每一个分区的迭代器

其中preserversPartitons表示是否保留父RDD的partitioner分区信息

如果在映射的过程中需要频繁创建额外的对象,使用mapPartitions操作要比map操作高效得多

比如,将RDD中的所有数据通过JDBC连接写入数据库,如果使用map函数,可能要为每一个元素都创建一个connection,这样开销很大

如果使用mapPartitions,那么只需要针对每一个分区建立一个connection

mapPartitionsWithIndex[U](f:(Iter), preserversPartitons:Boolean):RDD[U]

mapPartitionsWithIndex 操作作用类似于mapPartitions,只是输入参数多一个了分区索引

zip[U](other:RDD[U]):RDD[(T,U)]

zip操作用于将两个RDD组合成Key/Value形式的RDD,这里默认两个RDD的partition数量以及元素数量相同,否则会抛出异常

zipPartitions[B,V](rdd2:RDD[B])

zipPartitions 操作将多个RDD按照partition组合成新的RDD,该操作需要组合的RDD具有相同的分区数,但对于每个分区内的元素数量没有要求

zipWithIndex():RDD[(T,Long)]

zipWithIndex操作将RDD中的元素和这个元素在RDD中的ID(索引号)组合成键/值对

zipWithUniqueId():RDD[(T,Long)]

zipWithUniqueId 操作将RDD中的元素和一个唯一ID组合成键/值对,该唯一ID生成算法如下:

  • 每个分区中第一个元素的唯一ID值为: 该分区索引号
  • 每个分区中第N个元素的唯一ID值为:(前一个元素的唯一ID值) + (该RDD总的分区数)

键值转换操作

partitionBy(partitioner: Partitioner):RDD[(K, V)]

partitionBy 操作根据partitioner函数生成新的ShuffleRDD

mapValues[U](f:(V) => U):RDD[(K, U)]

mapValues类似于map,只不过mapValues是针对[K,V]中的V值进行map操作

flatMapValues[U](f:(V) => TraverableOnce[U]):RDD[(K,U)]

flatMapValues 相对flatMap, flatMapValues是针对[K,V]中的V值进行flatMap操作

combineByKey[C](createCombiner:(V), mergeValue:(C, V), mergeCombiners)

combineByKey 操作用于将RDD[K,V]转换成RDD[K,C].这里V类型和C类型可以相同也可以不同

combineByKey 参数含义

  • createCombiner: 组合器函数,用于将V类型转换成C类型,输入参数为RDD[K,V]中的V,输出为C
  • mergeValue: 合并值函数,将一个C类型和一个V类型值合并成一个C类型,输入参数为(C,V),输出为C
  • mergeCombiners: 合并组合器函数,用于将两个C类型值合并成一个C类型,输入参数为(C,C),输出为C
  • numPartitons: 结果RDD分区数,默认保持原有的分区数
  • partitioner: 分区函数,默认为HashPartitioner
  • mapSideCombine: 是否需要在Map端进行combine操作,类似于MapReduce中的combine,默认为true

foldByKey(zeroValue:V)(func:(V, V)=>V):RDD[(K,V)]

foldByKey 操作用于RDD[K, V]转换K将V做折叠、合并处理。其中参数zeroValue表示先根据映射函数将zeroValue应用于V
进行初始化V,再将映射函数应用于初始化后的V

reduceByKey(func:(V, V) => V):RDD[(K,V)]

reduceByKey操作用于将RDD[K,V]中每个K对应的V值根据映射函数来运算,其中参数numPartitions用于指定分区数,参数partitioner用于指定分区函数

reduceByLocally(func:(V, V) => V):Map[K,V]

reduceByLocally 和 reduceByKey 功能类似,不同的是,reduceByLocally运算结果映射到一个Map[K,V]中,而不是RDD[K,V]

groupByKey():RDD[(K, Iterable[V])]

groupByKey 操作用于将RDD[K,V]中每个K对应的V值合并到一个集合Iterable[V]中

cogroup[W](other:RDD[(K,V)]):RDD[(K,(Iterable[V], Iterable[W]))]

cogroup 相当于SQL中的全外关联,返回左右RDD中的记录,关联不上的为空

可传入的参数有1~3个RDD,参数numPartitons用于指定分区数,参数partitioner用于指定分区函数

join、fullOuterJoin、leftOuterJoin、rightOuterJoin

join、fullOuterJoin、leftOuterJoin、rightOuterJoin 都是针对RDD[K,V]中K值相等的连接操作

分别对应内连接、全连接、左连接和右连接。这些操作都调用cogroup进行实现,subtractByKey和基本操作subtract,只是subtractByKey针对的是键值操作

其中参数numPartions用于指定分区数,参数partitioner用于指定分区函数

控制操作

cache():RDD[T]

缓存

persist():RDD[]

persit(level:StorageLevel):RDD[T]

行动操作

集合标量行动操作

first(): T 表示返回RDD中的第一个元素,不排序

count(): Long 表示返回RDD中的元素个数

reduce(f:(T, T) => T):T

根据映射函数f,对RDD中的元素进行二元计算

collect(): Array[T]

表示将RDD转换成数组

take(num: Int): Array[T]

表示获取RDD中从0到num-1下标的元素,不排序

top(num: Int): Array[T]

表示从RDD中,按照默认(降序)或者指定的排序规则,返回前num个元素

takeOrdered(num: Int): Array[T]

和top类似,只不过以和top相反的顺序返回元素

aggregate[U](zeroValue: U)(seqOp: (U, T) => U, combOp: (U,U) => U)

用户聚合RDD中的元素,先使用seqOp将RDD中每个分区中的T类型聚合成U类型

再使用combOp将之前每个分区聚合后的U类型聚合成U类型,特别注意seqOp和combOp都会使用zeroValue的值,zeroValue的类型的为U

fold(zeroValue: T)(op: (T, T)=>T): Taggregate

fold是aggregate的简化,将aggregate中的seqOp和combOp使用同一个函数op

lookup(key: K): Seq[V]

lookup用于(K,V)类型的RDD,指定K值,返回RDD中该K对应的所有V值

countByKey(): Map[K, Long]

countByKey 统计RDD[K, V]中每个K的数量

foreach(f:(T) => Unit): Unit

foreach 遍历RDD,将函数f应用于每一个元素

要注意如果对RDD执行foreach,只会在Executor端有效,而并不是Driver端

foreachPartition(f:(Iterator[T]) => Unit): Unit

foreachPartition 和 foreach类似,只不过是对每一个分区使用f

sortBy[K](f:(T), ascending:Boolean, numPartitions):RDD[T]

sortBy根据给定的排序k函数将RDD中的元素进行排序

存储行动操作

saveAsTextFile(path: String): Util

saveAsTextFile 用于将RDD以文本文件的格式存储到文件系统中,codec参数可以指定压缩的类名

saveAsTextFile 用于将RDD以SequenceFile的文件格式保存到HDFS上

saveAsObjectFile(path: String): Util

saveAsObjectFile 用于将RDD中的元素序列化对象,存储到文件中,对于HDFS,默认采用SequenceFile保存

saveAsHadoop

saveAsHadoopFile 是将RDD存储在HDFS上的文件中

saveAsHadoopDataset(conf: JobConf): Unit

用于将RDD保存到除了HDFS的其他存储中,比如HBase

在JobConf中,通常需要关注或者设置5个参数: 文件的保存路径、key值的class类型、value值的class类型、RDD的输出格式以及压缩相关参数

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

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

相关文章

【mysql进阶】4-7. 通用表空间

通⽤表空间 - General Tablespace 1 通⽤表空间的作⽤和特性? ✅ 解答问题 通⽤表空间是使⽤ CREATE tablespace 语法创建的共享InnoDB表空间 通⽤表空间能够存储多个表的数据,与系统表空间类似也是共享表空间; 服务器运⾏时会把表空间元数…

python爬虫——Selenium的基本使用

目录 一、Selenium的介绍 二、环境准备 1.安装Selenium 2.安装WebDriver 三、元素定位 1.常用定位元素的方法 2. 通过指定方式定位元素 四、窗口操作 1.最大化浏览器窗口 2.设置浏览器窗口大小 3.切换窗口或标签页 切换回主窗口 4. 关闭窗口 关闭当前窗口 关闭所…

博客搭建之路:hexo增加搜索功能

文章目录 hexo增加搜索功能本地搜索弊端algolia搜索 hexo增加搜索功能 hexo版本5.0.2 npm版本6.14.7 next版本7.8.0 作为一个博客,没有搜索功能,如何在大批文章中找到自己想要的,那在hexo中如何增加搜索功能呢? search:path: sea…

用接地气的例子趣谈 WWDC 24 全新的 Swift Testing 入门(一)

概述 从 WWDC 24 开始,苹果推出了全新的测试机制:Swift Testing。利用它我们可以大幅度简化之前“老态龙钟”的 XCTest 编码范式,并且使得单元测试更加灵动自由,更符合 Swift 语言的优雅品味。 在这里我们会和大家一起初涉并领略…

2.Linux按键驱动-创建字符设备,通过应用程序读取按键值

1.在上一个博客的基础上,添加一个字符设备 https://blog.csdn.net/weixin_40933496/article/details/143253515?spm1001.2014.3001.55012.在probe函数中注册字符设备 register_chrdev(包含对应的file_operations结构体) class_create device_create3.在中断处理函…

基于大模型的招聘智能体:从创意到MVP

正在考虑下一个 SaaS 创意?以下是我在短短几个小时内从创意到 MVP 的过程。 以下是我将在这篇文章中介绍的内容概述: 为什么这个想法让我产生共鸣我是如何开始构建它的我现在的处境以及我是否会真正推出 获得 SaaS 创意并构建它并不容易。就是这样。 …

opencv学习笔记(1):基础知识

1.像素: 像素:数字图像的最小单位。数字图像由像素组成,像素由一系列代码表示的原色组合而成。 2.颜色空间: 颜色空间:也称彩色模型(又称彩色空间或彩色系统)。 (说白了就是用来描述…

FCN深度学习语义分割开山之作——学习笔记

《Fully Convolutional Networks for Semantic Segmentation》提出了首个端到端的针对像素级预测的全卷积网络(FCN),可直接处理任意大小的输入图像并输出相应大小的预测结果,超过了现有技术水平。 一、提出背景 传统的语义分割方…

[计算机网络]第一周

TCP/IP 与OSI TCP/IP TCP/IP 四层模型是一个分层网络通信模型,它将网络通信过程分为四个层次,这四层分别是:网络接口层、互联网层、传输层和应用层。 网络接口层负责在计算机和网络硬件之间传输数据,负责在物理网络上发送和接收…

2024“源鲁杯“高校网络安全技能大赛-Misc-WP

Round 1 hide_png 题目给了一张图片,flag就在图片上,不过不太明显,写个python脚本处理一下 from PIL import Image ​ # 打开图像并转换为RGB模式 img Image.open("./attachments.png").convert("RGB") ​ # 获取图像…

241026-RHEL如何以root身份卸载Docker

在 RHEL 8.8 中,以 root 身份卸载 Docker 可以通过以下步骤完成: 停止 Docker 服务(如果已启动): sudo systemctl stop docker删除 Docker 包: 运行以下命令卸载 Docker 引擎及其依赖包(docker-…

Redis多级缓存

多级缓存 传统缓存的问题 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,存在下面的问题: 请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈Redis缓存失效时,会对数据…

在多数据中心环境中,自动化运维如何保证跨区域的一致性?网络延迟导致的数据不一致是否可以完全避免?|自动化运维|跨区域一致性

目录 1. 跨区域一致性的定义与重要性 1.1 跨区域一致性的定义 1.2 跨区域一致性的意义 2. 网络延迟的挑战 2.1 网络延迟的来源 2.2 网络延迟对一致性的影响 3. 自动化运维如何实现跨区域一致性 3.1 使用分布式数据库 3.2 采用同步与异步复制 3.3 引入一致性协议 3.4…

Uni-App-03

登录功能开发 实现POST提交 HTTP协议规定请求消息内容类型(Content-Type)有哪些?—— 只有四种 text/plain 没有编码的普通数据 application/x-www-form-urlencoded 编码后的普通数据 multipart/form-data 请求主体中包含文件上传域 application/json 请求主体是 J…

【云原生网关】Higress 从部署到使用详解

目录 二、网关概述 2.1 什么是云原生网关 2.2 常见的云原生网关 2.2.1 Nginx 2.2.2 ApiSix 2.2.3 Kong 2.2.4 Apache Shenyu 2.2.5 Higress 2.2.6 Envoy​​​​​​​ 三、higress介绍 3.1 什么是higress 3.2 Higress 定位 3.3 Higress 内核选择 四、Higress搭…

Vscode + EIDE +CortexDebug 调试Stm32(记录)

{// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0","configurations": [{"cwd": "${workspaceRoot…

阿里面试竟被“DPO微调”吊打...

最近已有不少大厂都在秋招宣讲,也有一些已在 Offer 发放阶段了。 节前,我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新手如何入门算法岗、该如何准备面试攻略、面试常考点、大模型技术趋势、算法项目落地经验分享等热门话题进行…

一个可以调节笔记本亮度的程序

在我这台笔记本上,当我把显示模式调为读显时发现右下角的亮度不能调了,就像这样 听说时nvidia显卡不适配的问题 咱也不知道呀 于是我就用java写了程序来调节,用了俩个多月,没啥问题的 打开就是这样拉动直接就可以调节 源码 im…

unity中的组件(Component)

在 Unity 中,组件(Component)是构成 GameObject 功能和行为的基础单元,每个 GameObject都可以附加一个或多个组件,以实现不同的功能 1. Transform 组件 描述:所有 GameObject 默认都有一个 Transform 组件…

C++研发笔记8——C语言程序设计初阶学习笔记6

在第一部分——课前准备的学习中,我就提到了学习C语言的过程中,练习是必不可少的环节,所以本篇笔记我们来进行记录我们学习《C语言程序设计初阶》阶段的第一篇练习文章。 题目一 下面哪个不是C语言内置的数据类型: A.char B.d…