Cui*_*崔鹏飞 8 scala aggregate heterogeneous homogenous-transformation apache-spark
使用Scala标准库时,我可以做这样的事情:
scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)
scala> scalaList.foldLeft(0)((acc,n)=>acc+n)
res0: Int = 6
Run Code Online (Sandbox Code Playgroud)
从许多Int中取出一个Int.
我可以这样做:
scala> scalaList.foldLeft("")((acc,n)=>acc+n.toString)
res1: String = 123
Run Code Online (Sandbox Code Playgroud)
从许多Int中制作一个String.
因此,foldLeft可以是同构的,也可以是异构的,无论我们想要什么,它都在一个API中.
在Spark中,如果我想要很多Int中的一个Int,我可以这样做:
scala> val rdd = sc.parallelize(List(1,2,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
Run Code Online (Sandbox Code Playgroud)
fold API类似于foldLeft,但它只是同类的,RDD [Int]只能生成带折叠的Int.
Spark中也有一个聚合API:
scala> rdd.aggregate("")((acc,n)=>acc+n.toString, (s1,s2)=>s1+s2)
res11: String = 132
Run Code Online (Sandbox Code Playgroud)
它是异构的,RDD [Int]现在可以生成一个String.
那么,为什么fold和聚合在Spark中实现为两个不同的API?
为什么它们的设计不像foldLeft那样可以是同构的还是异构的?
(我对Spark很新,请原谅我这是一个愚蠢的问题.)
fold可以更有效地实现,因为它不依赖于固定的评估顺序。因此,每个集群节点都可以fold并行地拥有自己的块,然后fold在最后形成一个小的整体。然而foldLeft每个元素都必须按顺序折叠,并且不能并行执行任何操作。
(为了方便起见,为常见情况提供一个更简单的 API 也很好。出于这个原因,标准库也有reduce和)foldLeft
| 归档时间: |
|
| 查看次数: |
4489 次 |
| 最近记录: |