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保存到外部文件系统或者数据库中

创建操作

parallelizeT(seq:SeqT, numSlices:Int)

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

makeRDDT(seq:Seq(T, Seq\[String)]):RDDT

并行化集合创建操作

基础转换操作

mapU(f:(T) => U):RDDU

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

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

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

flatMapU(f:(T) => TraversableOnceU):RDDU

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

coalesce(numPartitions:Int,shuffle:Boolean = false):RDDT

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

repartition(numPartitions:Int):RDDT

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

randomSplit(weights:ArrayDouble, send:Long):ArrayRDD\[T]

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

glom():RDDArray\[T]

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

union(other:RDDT):RDDT

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

intersection(other:RDDT):RDDT

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

subtract(other:RDDT):RDDT

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

mapPartitionsU(f:(Iter), preserversPartitons:Boolean)

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

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

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

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

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

mapPartitionsWithIndexU(f:(Iter), preserversPartitons:Boolean):RDDU

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

zipU(other:RDDU):RDD(T,U)

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

zipPartitionsB,V(rdd2:RDDB)

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

mapValuesU(f:(V) => U):RDD(K, U)

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

flatMapValuesU(f:(V) => TraverableOnceU):RDD(K,U)

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

combineByKeyC(createCombiner:(V), mergeValue:(C, V), mergeCombiners)

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

combineByKey 参数含义

  • createCombiner: 组合器函数,用于将V类型转换成C类型,输入参数为RDDK,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 操作用于RDDK, V转换K将V做折叠、合并处理。其中参数zeroValue表示先根据映射函数将zeroValue应用于V

进行初始化V,再将映射函数应用于初始化后的V

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

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

reduceByLocally(func:(V, V) => V):MapK,V

reduceByLocally 和 reduceByKey 功能类似,不同的是,reduceByLocally运算结果映射到一个MapK,V中,而不是RDDK,V

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

groupByKey 操作用于将RDDK,V中每个K对应的V值合并到一个集合IterableV

cogroupW(other:RDD(K,V)):RDD(K,(Iterable\[V, IterableW))]

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

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

join、fullOuterJoin、leftOuterJoin、rightOuterJoin

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

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

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

控制操作

cache():RDDT

缓存

persist():RDD\[\]

persit(level:StorageLevel):RDDT

行动操作

集合标量行动操作

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

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

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

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

collect(): ArrayT

表示将RDD转换成数组

take(num: Int): ArrayT

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

top(num: Int): ArrayT

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

takeOrdered(num: Int): ArrayT

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

aggregateU(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): SeqV

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

countByKey(): MapK, Long

countByKey 统计RDDK, V中每个K的数量

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

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

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

foreachPartition(f:(IteratorT) => Unit): Unit

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

sortByK(f:(T), ascending:Boolean, numPartitions):RDDT

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的输出格式以及压缩相关参数

相关推荐
zhuhai_xigedian16 小时前
区块链技术加持:源网荷储系统的能源数据安全与溯源
大数据·区块链·能源
经济视野16 小时前
朗禾品牌设计,深耕餐饮VI与空间设计,以专业实力赋能品牌成长
大数据·人工智能
IT阿瑞16 小时前
制造业 AI Agent 实施服务商横评:2026 年企业级自动化选型全景分析
大数据·人工智能·自动化
媒介发稿小能手16 小时前
合规优化与API接口协同:2026年靠谱GEO媒介资源平台推荐清单
大数据·人工智能
知识分享小能手16 小时前
Hadoop学习教程,从入门到精通, 部署Hadoop 3.x — 知识点详解(2)
大数据·hadoop·学习
moonsims16 小时前
基于Lattice Mesh的AI 的分布式共识与动态任务分配架构的无人机群“去中心化无声协同”技术和极低带宽下的韧性通信技术
人工智能·分布式·架构
涛思数据(TDengine)16 小时前
从时序数据库到工业AI:涛思数据参编“人工智能+工业软件”评价规范,推动工业数据标准
大数据·数据库·人工智能·时序数据库·tdengine·涛思数据·工业数据库
CyberwayTech17 小时前
赛博威线上营销费用管理咨询:重构企业电商费用管理体系
大数据·人工智能·it·赛博威·营销费用管理·营销费用管理咨询
五度易链-区域产业数字化管理平台17 小时前
产业大脑技术架构拆解:从多源数据治理到产业链断点识别的全链路实现逻辑
大数据
一个骇客17 小时前
批处理模型详解:从 MapReduce 到数据流引擎
分布式·架构