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 から 1 つの Int を作成します。
そして、私は次のようなことができます:
scala> scalaList.foldLeft("")((acc,n)=>acc+n.toString)
res1: String = 123
多くの Int から 1 つの String を作成します。
したがって、foldLeft は同種または異種のいずれかである可能性があり、必要に応じて 1 つの API に含まれます。
Spark で、多くの Int から 1 つの 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
フォールド 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 を生成できるようになりました。
では、なぜフォールドと集約が Spark で 2 つの異なる API として実装されているのでしょうか?
同種と異種の両方であるfoldLeftのように設計されていないのはなぜですか?
(私は Spark に非常に慣れていないため、これがばかげた質問である場合はご容赦ください。)