为什么partition.size在foreachPartition中变为零

时间:2015-06-10 08:46:00

标签: scala apache-spark

在下面的代码中(用scala编写),我打印了partition.size两次,但得到了两个不同的结果。

代码:

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

结果:

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

根据Spark API文档,partition是一种Iterator

 public void btn_2(View view)
 {
   play_2= MediaPlayer.create(this,R.raw.a1);
   play_2.start();
   while(play_2.isPlaying()) ; 
   play_2.release(); 

 }

那么为什么分区的大小设置为0?

1 个答案:

答案 0 :(得分:6)

挖掘后我找到答案,这不是Spark或你的程序的问题。它基本上按设计工作。我的意思是foreachpartition方法闭包将Iterator [T]作为输入,它是一个scala迭代器。在scala迭代器上调用size()方法时,它会计算大小并移动到列表的末尾。查看Scala Iterator的文档,

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

  

它返回的元素数量。 注意:此操作后它将结束!

当你要求迭代器给你大小时,它会遍历它指向的序列中的每个元素,每次向右移动一个位置。当它没有更多元素遍历iterator.hasNext == false时,它将返回大小。但到那时它将耗尽所有元素。 因此,当第二次检索大小时,它返回0