加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 为什么在Spark中聚合和折叠两个不同的API?

发布时间:2020-12-16 19:16:34 所属栏目:安全 来源:网络整理
导读:使用 Scala标准库时,我可以做这样的事情: scala val scalaList = List(1,2,3)scalaList: List[Int] = List(1,3)scala scalaList.foldLeft(0)((acc,n)=acc+n)res0: Int = 6 从许多Int中取出一个Int. 我可以这样做: scala scalaList.foldLeft("")((acc,n)=ac
使用 Scala标准库时,我可以做这样的事情:

scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1,3)

scala> scalaList.foldLeft(0)((acc,n)=>acc+n)
res0: Int = 6

从许多Int中取出一个Int.

我可以这样做:

scala> scalaList.foldLeft("")((acc,n)=>acc+n.toString)
res1: String = 123

从许多Int中制作一个String.

因此,foldLeft可以是同构的,也可以是异构的,无论我们想要什么,它都在一个API中.

在Spark中,如果我想要很多Int中的一个Int,我可以这样做:

scala> val rdd = sc.parallelize(List(1,3))
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[1] at parallelize at <console>:12
scala> rdd.fold(0)((acc,n)=>acc+n)
res1: Int = 6

fold API类似于foldLeft,但它只是同类的,RDD [Int]只能生成带折叠的Int.

Spark中也有一个聚合API:

scala> rdd.aggregate("")((acc,n)=>acc+n.toString,(s1,s2)=>s1+s2)
res11: String = 132

它是异构的,RDD [Int]现在可以生成一个String.

那么,为什么fold和aggregate在Spark中实现为两个不同的API?

为什么它们的设计不像foldLeft那样可以是同构的还是异构的?

(我对Spark很新,请原谅我这是一个愚蠢的问题.)

解决方法

fold可以更有效地实现,因为它不依赖于固定的评估顺序.因此,每个群集节点可以并行折叠自己的块,然后在末尾折叠一个小的整体.而对于foldLeft,每个元素必须按顺序折叠,并且没有任何东西可以并行完成.

(为方便起见,为常见情况提供一个更简单的API也很不错.由于这个原因,标准的lib已经减少以及foldLeft)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读