我想要RDD
表現的動作,如reduce
,但不需要操作符可交換。即我希望result
將始終是"123456789"
。RDD中是否有任何操作保持順序?
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{ _+_ }
首先,我找到了fold
。的RDD#fold
的醫生說:
DEF摺疊(零值:T)(OP:(T,T)⇒T):T骨料 每個分區的所有分區中的元件,並且然後將結果,使用一個 給聯想功能和中性「零值」
注意,沒有可交換在doc需要。但是,預期的結果並不:
scala> rdd.fold(""){ _+_ }
res10: String = 312456879
編輯我曾嘗試通過@ DK14提到,沒有運氣:
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
您錯過了文檔的下一部分,它描述了您所看到的內容:*「這與在Scala等函數語言中爲非分佈式集合實現的摺疊操作有些不同,這種摺疊操作可能適用於然後將這些結果摺疊到最終結果中,而不是按照某些定義的順序將摺疊應用於每個元素。對於不可交換的函數,結果可能與應用於非分佈式集合的摺疊結果不同。「* –