我想要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等函数语言中为非分布式集合实现的折叠操作有些不同,这种折叠操作可能适用于然后将这些结果折叠到最终结果中,而不是按照某些定义的顺序将折叠应用于每个元素。对于不可交换的函数,结果可能与应用于非分布式集合的折叠结果不同。“* –