【发布时间】:2014-10-29 15:47:05
【问题描述】:
当使用 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
从许多 Int 中制作一个 Int。
我可以这样做:
scala> scalaList.foldLeft("")((acc,n)=>acc+n.toString)
res1: String = 123
从多个 Int 中创建一个字符串。
因此,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
fold API 与 foldLeft 类似,但它只是同构的,一个 RDD[Int] 只能产生带有 fold 的 Int。
spark 中也有一个聚合 API:
scala> rdd.aggregate("")((acc,n)=>acc+n.toString, (s1,s2)=>s1+s2)
res11: String = 132
它是异构的,一个RDD[Int]现在可以产生一个String。
那么,为什么在 Spark 中折叠和聚合实现为两个不同的 API?
为什么它们不像 foldLeft 那样设计,既可以是同质的,也可以是异构的?
(我是 Spark 的新手,如果这是一个愚蠢的问题,请原谅。)
【问题讨论】:
标签: scala aggregate apache-spark heterogeneous homogenous-transformation