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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |