Wenn der Scala Standard lib verwendet, kann ich ungefähr wie folgt tun:Warum aggregieren und falten zwei verschiedene APIs in Spark?
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
Machen ein Int aus vielen Ints.
Und ich kann so etwas tun:
scala> scalaList.foldLeft("")((acc,n)=>acc+n.toString)
res1: String = 123
Machen ein String aus vielen Ints.
Also, foldLeft könnte entweder homogen oder heterogen sein, was immer wir wollen, es ist in einer API.
Während in Spark, wenn ich aus vielen Ints ein Int will, kann ich dies tun:
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
Die Falte API foldLeft ähnlich ist, aber es ist nur homogen, ein RDD [Int] können produziere nur Int mit Falte.
Es ist ein Aggregat API in Funken zu:
scala> rdd.aggregate("")((acc,n)=>acc+n.toString, (s1,s2)=>s1+s2)
res11: String = 132
Es ist heterogen, ein RDD [Int] jetzt einen String erzeugen kann.
Warum werden Falte und Aggregat als zwei verschiedene APIs in Spark implementiert?
Warum sind sie nicht wie foldLeft konzipiert, die sowohl homogen als auch heterogen sein könnten?
(Ich bin sehr neu für Zündkerzen, mich bitte entschuldigen, wenn dies eine dumme Frage.)
Um genauer zu sein, 'fold' in Spark erfordert sowohl die Assoziativität als auch die Kommutativität, während "falten" in Scala und anderen nicht verteilten Frameworks keine Kommutativität erfordert. Weitere Informationen finden Sie in der Spark-Dokumentation [hier] (https://spark.apache.org/docs/latest/api/java/org/apache/spark/rdd/RDD.html#fold (T,% 20scala.Function2)) – FuzzY