2015-06-10 2 views
1

В следующем коде (написанном на scala) я дважды печатаю partition.size, но получаю два разных результата.Почему partition.size обращается к нулю в foreachPartition

Код:

val a = Array(1,2,3,4,5,6,7,8,9) 
val rdd = sc.parallelize(a) 

rdd.foreachPartition { 
     partition => 
     println("1. partition.size: " + partition.size) //1. partition.size: 2 
     println("2. partition.size: " + partition.size) //2. partition.size: 0 
} 

Результаты:

1. partition.size: 2 
2. partition.size: 0 

Согласно Спарк API документ, раздел представляет собой тип итератора

def foreachPartition(f: (Iterator[T]) ⇒ Unit): Unit 
     Applies a function f to each partition of this RDD. 

Так почему размер раздела устанавливается до 0?

ответ

4

После копания я нашел ответ, это не проблема ни с Спарком, ни с вашей программой. Он в основном работает как разработанный. Я имею в виду, что закрытие метода foreachpart Iterator [T] является входом, который является итератором scala. Когда метод size() вызывается на итераторе scala, он вычисляет размер и перемещается в конец списка. посмотрите документацию от Scala итератор

http://www.scala-lang.org/docu/files/collections-api/collections_43.html

Количество элементов, возвращаемых ею. Примечание: после этой операции это будет на конце!

Когда вы просите итератора, чтобы дать вам размер, то он будет проходить каждый элемент в последовательности он указывает, перемещая каждый раз на одну позицию вправо. Когда у него больше нет элементов для перемещения iterator.hasNext == false, он вернет размер. Но к тому времени он исчерпает все элементы. И, следовательно, когда размер извлекается во второй раз, он возвращает 0

+0

@Moriarty, ответит ли это на ваш вопрос? – Sathish

+0

Благодарим вас за ответ. И документация Scala Iterator тоже полезна. Так как правильно возвращать 0 после итерации, я обнаружил еще одну интересную вещь: ** Array [T] .iterator.size ** возвращает ненулевое значение при каждом вызове. Я прочитаю исходный код ** scala.Array ** и найду ответ позже. Еще раз спасибо. :) – Moriarty

+0

приветствую :) – Sathish

Смежные вопросы