Chcę wykonać działanie w trybie RDD
, takie jak reduce
, ale nie trzeba, aby operator był przemienny. tj. chcę, aby result
na następnej stronie zawsze będzie "123456789"
.Czy w RDD są jakieś działania dotyczące zamówienia?
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{ _+_ }
Najpierw znalazłem fold
. Doc z RDD#fold
mówi:
def krotnie (zeroValue T) (PO: (T, T) ⇒ T) T zbiorczej elementy każdej partycji, a następnie wyniki dla wszystkich przegród, przy użyciu podane asocjacyjne funkcja i neutralną „wartość zero”
Zauważ, że nie ma przemienne potrzebne w dok. Jednak wynik nie jest zgodnie z oczekiwaniami:
scala> rdd.fold(""){ _+_ }
res10: String = 312456879
EDIT Próbowałem jak wspomniano przez @ dk14, bez powodzenia:
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
Tęskniłeś za następną sekcją dokumentów, która opisuje to, co widzisz: * "To działa nieco inaczej niż operacje składane zaimplementowane dla nieproszonych zbiorów w językach funkcjonalnych, takich jak Scala. partycje pojedynczo, a następnie zawijać te wyniki w końcowy wynik, zamiast stosować fałdę do każdego elementu sekwencyjnie w określonym porządku. W przypadku funkcji, które nie są przemienne, wynik może różnić się od wyniku fałdu zastosowanego do kolekcji niepodzielonej "* –