reduce
gibi bir performans istiyorum ancak operatörün değişmeli olmasına gerek yok. Yani, result
takip edilmesinin her zaman "123456789"
olmasını istiyorum.RDD'de herhangi bir işlem emri saklıyor mu?
scala> val rdd = sc.parallelize(1 to 9 map (_.toString))
rdd: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[24] at parallelize at <console>:24
scala> val result = rdd.someAction{ _+_ }
Öncelikle, fold
bulduk. RDD#fold
doc söyler:
def (zeroValue: T) kat kullanılarak, bütün bölümler için elemanları, her bölüm, ve daha sonra sonuç, T Agrega (op: (T, T) T ⇒) bir verilen birleştirici fonksiyonu ve nötr "sıfır değer" doc gerekmez değişmeli olduğu
not edin. Ancak, sonuç beklenmediği:
scala> val rdd = sc.parallelize(1 to 9 map (_.toString))
rdd: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[48] at parallelize at <console>:24
scala> rdd.zipWithIndex.map(x => (x._2, x._1)).sortByKey().map(_._2).fold(""){ _+_ }
res22: String = 341276895
scala> rdd.zipWithIndex.map(x => (x._2, x._1)).sortByKey().map(_._2).fold(""){ _+_ }
res23: String = 914856273
scala> rdd.zipWithIndex.map(x => (x._2, x._1)).sortByKey().map(_._2).fold(""){ _+_ }
res24: String = 742539618
scala> rdd.zipWithIndex.map(x => (x._2, x._1)).sortByKey().map(_._2).fold(""){ _+_ }
res25: String = 271468359
Belgelerin bir sonraki bölümünü, ne gördüğünüzü açıklayan özlediniz: * "Bu, Scala gibi işlevsel dillerdeki dağıtılmamış koleksiyonlar için uygulanan katlama işlemlerinden biraz farklıdır. Bu katlama işlemi Bölümleri ayrı ayrı bölümlere ayırın ve daha sonra, belirli bir düzende sırayla her bir öğeye katlamayı uygulamak yerine bu sonuçları kesin sonuca katlayın .. Değişmez olmayan işlevler için, sonuç dağıtılmamış bir koleksiyona uygulanan bir katlamadan farklı olabilir. "* –