Quando si utilizza il lib standard di Scala, posso fare somthing come questo:Perché in Spark si aggregano e si piegano due API diverse?
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
Facendo Int di molti Ints.
E posso fare qualcosa di simile:
scala> scalaList.foldLeft("")((acc,n)=>acc+n.toString)
res1: String = 123
Fare una stringa di molti Ints.
Quindi, foldLeft potrebbe essere o omogeneo o eterogeneo, qualunque sia il nostro obiettivo, è in un'unica API.
Mentre in Spark, se voglio uno Int di molti Ints, posso fare questo:
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
L'API piega è simile a foldLeft, ma è omogenea solo, un RDD [Int] posso produce solo Int con piega.
C'è un'API aggregato scintille anche:
scala> rdd.aggregate("")((acc,n)=>acc+n.toString, (s1,s2)=>s1+s2)
res11: String = 132
È eterogeneo, un RDD [Int] può produrre una stringa ora.
Quindi, perché le funzioni di piega e aggregazione sono implementate come due API diverse in Spark?
Perché non sono progettati come foldLeft che potrebbe essere sia omogeneo che eterogeneo?
(Sono molto nuovo a Spark, si prega di scusarmi se questa è una domanda stupida.)
Per essere più precisi, 'fold' in Spark richiede sia l'associatività _and_ commutatività, mentre 'fold' in Scala e altri framework non distribuiti non richiede commutatività. Controlla la documentazione di Spark [qui] (https://spark.apache.org/docs/latest/api/java/org/apache/spark/rdd/RDD.html#fold (T,% 20scala.Function2)) – FuzzY