Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 映射分区迭代器返回_Scala_Apache Spark - Fatal编程技术网

Scala 映射分区迭代器返回

Scala 映射分区迭代器返回,scala,apache-spark,Scala,Apache Spark,任何人都可以帮助接受将迭代器listWords()方法返回mapPartitions object MapPartitionExample { def main(args: Array[String]): Unit = { val conf= new SparkConf().setAppName("MapPartitionExample").setMaster("local[*]") val sc= new SparkContext(conf) val inpu

任何人都可以帮助接受将迭代器listWords()方法返回mapPartitions

object MapPartitionExample {

  def main(args: Array[String]): Unit = {

    val conf= new SparkConf().setAppName("MapPartitionExample").setMaster("local[*]")
    val sc= new SparkContext(conf)

    val input:RDD[String] = sc.parallelize(List("ABC","DEF","GHU","YHG"))

    val x= input.mapPartitions(word => listWords(word))


  }

  def listWords(words: Iterator[String]) : util.Iterator[String] = {

    val arrList = new util.ArrayList[String]()
    while( words.hasNext ) {
      arrList.add( words.next())
    }
    return arrList.iterator()
  }

}

应为
Iterable[NotInferU]
,但返回的是
java.util.Iterator[String]

您需要通过导入
scala.collection.JavaConversions将
java.util.迭代器
转换为
scala迭代器

  def listWords(words: Iterator[String]) : Iterator[String] = {
    val arrList = new util.ArrayList[String]()
    while( words.hasNext ) {
      arrList.add( words.next())
    }
    import scala.collection.JavaConversions._
    return arrList.toList.iterator
  }
其余代码保持原样


我希望答案是有帮助的

mapPartitions
中使用的函数的返回类型应该是
scala.collection.Iterator
,而不是
java.util.Iterator
。我看不出您当前的代码有什么意义,但您可以使用Scala可变集合:

import scala.collection.mutable.ArrayBuffer

def listWords(words: Iterator[String]) : Iterator[String] = {
  val arr = ArrayBuffer[String]()
  while( words.hasNext ) {
    arr += words.next()
  }
  arr.toIterator
}
就我个人而言,我只是
map

def listWords(words: Iterator[String])  : Iterator[String] = {
   // Some init code
   words.map(someFunction)
}

请接受答案,然后选择您更喜欢的解决方案。:)