![](/img/trans.png)
[英]How do I return Spark RDD partition values without a local iterator?
[英]Map Partition Iterator return
任何人都可以幫助接受返回給MapPartitions的Iterator listWords()方法。
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()
}
}
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)
}
Iterable[NotInferU]
是Iterable[NotInferU]
,但是您要返回java.util.Iterator[String]
您需要通過如下所示導入scala.collection.JavaConversions._
將java.util.Iterator
轉換為scala Iterator
。
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
}
其余代碼保持不變。
我希望答案是有幫助的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.