spark学习(3)--高级算子

1、mapPartitionsWithIndex、mapPartitions(func)
对rdd中的每个分区进行某种处理
def mapPartitionsWithIndexInternal[U:ClassTag]
(f:(Int,Iterator[T])=>Interator[U],preservesPartitiong:Boolean=false)
Int :分区号,默认从0开始
Iterator[T]:分区中的元素
Iterator[U]:操作完成后的返回值
操作:
创建一个rdd:
val rdd1=sc.parallelize(List(1,2,3,4,5,6,7,8,9),2)
定义一个函数
def func1(index:Int,iter:Iterator[Int]):Iterator[String]={
iter.toList.map(elem=>"PartID: “+index+”,Value: "+elem).iterator
}
然后定义完函数,我们就对rdd1进行操作
val rdd2=rdd1.mapPartitionsWithIndex(func1)
rdd2.collect
mapPartitions(func)这个算子是和上一个差不多只不多是没有index
2、aggregate:聚合操作,先做局部操作后做全局操作
def aggregateU:ClassTag(seqop:(U,T)=>U,comOp:(U,U)=>U)
zeroValue:初始值 ,针对局部和全局都有效
seqop:是分区的操作方法
comOP:是全局操作方法

val rdd1=sc.parallelize(List(1,2,3,4,5,6,7,8,9),2)
rdd.aggregate(0)(math.max(_,_),_+_)

seqop是作用于分区上的rdd,comop是通过操作seqop后再对其结果进行的操作
aggregateByKey:和aggregate算子差不多,只不过操作的是<key,value>的数据类型,seqop是对分区中同样的key做的操作的结果再用comOp进行操作。
示例:
1、准备带有(key,value)的分区数据

val pairRDD=sc.parallelize(List(("cat",2),("cat",5),("mouse",4),("cat",12),("dog",12),("mouse",2)),2)

2、查看一下分区后的数据是什么样的。
定义一个分区操作函数

def func3(index:Int,iter:Iterator[(String,Int)]):Iterator[String]={
	iter.toList.map("PartID:"+index+" ,value:"+_).iterator
}
 pairRDD.mapPartitionsWithIndex(func3).collect

数据显示为:

Array[String] = Array(
PartID:0 ,value:(cat,2), PartID:0 ,value:(cat,5), PartID:0 ,value:(mouse,4),
 PartID:1 ,value:(cat,12), PartID:1 ,value:(dog,12), PartID:1 ,value:(mouse,2)
 )

3、使用aggregateByKey函数进行操作

(1)将每个动物园中动物数最多个数进行求和

pairRDD.aggregateByKey(0)(math.max(_,_),_+_)

结果是:Array[(String, Int)] = Array((dog,12), (cat,17), (mouse,6))
(2)求每种动物的和

pairRDD.aggregateByKey(0)(_+_,_+_).collect

结果是:res28: Array[(String, Int)] = Array((dog,12), (cat,19), (mouse,6))
总结:我认为其实在做aggregateByKey的时候,其实做了一次局部reduceByKey,
形成了分区0聚合后的数据为:(“cat”,(2,5)),(“mouse”,(4))
分区1聚合后的数据为:(“cat",(12)),(“dog”,(12)),(“mouse”,(2))
aggregateByKey初始化值0,其实往value中添加的,比如分区0聚合后的数据为
(“cat”,(2,5,0)),(“mouse”,(4,0)),分区1聚合后的数据为(“cat",(12,0)),(“dog”,(12,0)),(“mouse”,(2,0)),随后seqop中操作的和comop操作的数据其实均为value

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Spark算子Spark框架中的一种操作符,用于对RDD(弹性分布式数据集)进行转换和操作。Scala版本的Spark算子可以通过编写Scala代码来实现,常用的算子包括map、filter、reduce、join等。这些算子可以帮助开发者快速地进行数据处理和分析,提高数据处理效率和准确性。 ### 回答2: Spark算子Spark中的一个很重要的概念,它主要是用于数据的转换和处理。在Scala版本中,Spark算子有两种不同的类型,一个是转换操作的算子,另一个是行动操作的算子。这些算子被组织成RDD的API,以便在分布式环境中进行操作,从而实现高效的计算。 对于Spark算子来说,它的灵活性和方便性是非常重要的。因为在实际应用中,数据的处理往往是非常复杂和混杂的。这时,使用Spark算子可以很快地将数据转换成需要的格式,以便进行后续的处理。同时,Spark算子还可以极大地提高处理数据的效率,因为它们是在分布式集群上进行处理的,这样就可以大大缩短处理时间。 在Scala版本中,首要的算子map算子,它可以非常方便地对数据进行转换。除此之外,还有很多常用的算子,比如flatMap、reduceByKey、groupBy等,它们都具有一些独特的特性和用法,可以根据实际情况选择使用。当然,对于更加复杂的数据处理操作,也可以自定义函数来实现。Spark算子可以很容易地与自定义函数进行结合,从而实现更加灵活的数据处理操作。 总之,Spark算子Spark中一个非常重要的概念,它可以帮助我们高效地转换和处理数据。在Scala版本中,Spark算子是非常方便和易用的,可以满足各种不同场景下的需求。无论是初学者还是专业人士,都可以通过学习Spark算子来进一步提高自己的数据处理和计算能力。 ### 回答3: Spark是一种流行的分布式计算框架,它提供了自己的编程模型,称为Resilient Distributed Datasets(RDDs)。Scala是一种运行在Java虚拟机上的编程语言,它可以与Spark很好地配合使用,为Spark提供了Scala API,使得开发者可以使用Scala语言进行Spark开发。 在Scala API中,Spark提供了很多有用的算子,这些算子可以用于在分布式集群上操作RDDs。这些算子可以分为两类:转换算子和动作算子。 转换算子用于接受一个RDD,并返回一个新的RDD,这个新的RDD表示对原始RDD的一些转换操作。在这里,我们可以使用各种不同的转换功能,例如map、flatMap和filter。这些算子允许我们执行各种数据操作,例如将一组元素映射到另一组元素,或者仅选择符合某些条件的元素,等等。 动作算子用于接受一个RDD,并返回单个结果。这些算子在执行过程中会计算原始RDD的结果,并将结果返回给驱动程序。这些算子包括reduce、count、collect和foreach等。在这里,我们可以使用这些算子计算和收集RDD中特定的元素或结果。 总之,Spark算子Spark Scala API中的核心组件,使得开发者可以简便地操作分布式计算集群上的大型数据集。这些算子是开发Spark应用程序的基本部分,开发者应该了解它们的工作方式,以便能够更高效地处理数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枣泥馅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值