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 (zeroValue : T) 배하여 모든 파티션 요소마다 분할하고, 그 결과를 T 골재 (OP (T, T)의 T를 ⇒) 주어진 연관 함수 중성 "영점"다큐먼트에 필요하지 가환 없다고
참고. 그러나, 결과는 예상과 :
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
당신이보고있는 내용을 설명하는 문서의 다음 섹션을 놓쳤습니다. * "이것은 스칼라 같은 함수 언어의 비 분산 컬렉션에 대해 구현 된 fold 연산과는 다소 다르게 작동합니다. 분할 영역을 개별적으로 분할 한 다음 정의 된 순서에 따라 각 요소에 순차적으로 접기를 적용하지 않고 결과를 최종 결과로 접을 수 있습니다. 교환 가능하지 않은 함수의 경우 결과는 비 분산 컬렉션에 적용된 접기의 결과와 다를 수 있습니다 "* –