Как вернуть значения раздела Spark RDD без локального итератора? - PullRequest
0 голосов
/ 11 июня 2018

Я изучаю Spark и его параллелизм, связанный с распределением разделов RDD.У меня машина с 4 процессорами, следовательно, у меня есть 4 единицы параллелизма.Чтобы вернуть члены индекса раздела «0», я не смог найти способ вернуть этот раздел, не заставляя RDD использовать localIterator.

Я привык к тому, что я довольно краткий.Есть ли более краткий способ фильтрации СДР по разделам?Следующие два метода работают, но кажутся неуклюжими.

scala> val data = 1 to 20
data: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)

scala> val distData = sc.parallelize(data)
distData: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[75] at parallelize at <console>:26

scala> distData.mapPartitionsWithIndex{
   (index,it) => {
      it.toList.map(x => if (index == 0) (x)).iterator
   }
}.toLocalIterator.toList.filterNot(
   _.isInstanceOf[Unit]
)
res107: List[AnyVal] = List(1, 2, 3, 4, 5)

scala> distData.mapPartitionsWithIndex{
   (index,it) => {
      it.toList.map(x => if (index == 0) (x)).iterator
   }
}.toLocalIterator.toList.filter(
   _ match{
      case x: Unit => false
      case x => true
   }
)
res108: List[AnyVal] = List(1, 2, 3, 4, 5)

1 Ответ

0 голосов
/ 11 июня 2018
distData.mapPartitionsWithIndex{ (index, it) => 
      if (index == 0) it else Array[Int]().iterator
}

Вы можете вернуть пустой итератор, и он будет работать нормально.

...