我SparkContext
使用2个分区创建了一个数组,我也尝试使用它mapPartition
来处理元素,但是当我这样编写代码时,我遇到了一个非常奇怪的错误:
val masterURL = "local[*]"
val conf = new SparkConf().setAppName("KMeans Test").setMaster(masterURL)
val sc = new SparkContext(conf)
sc.setLogLevel("WARN")
val data = sc.textFile("file:/d:/data/kmeans_data.txt")
val parsedData = data.mapPartitions(partition => parseData(partition)).cache()
parsedData.mapPartitions(points =>
points.map(point =>
println(point)
)
)
它没有错误,但是,当我将map替换为foreach时,它提示一个错误:
parsedData.mapPartitions(points =>
points.foreach(point =>
println(point)
)
)
错误如下:
类型不匹配,预期:(Iterator [Vector])=> Iterator [NotInferedU],实际:(Iterator [Vector])=> Unit类型的Unit表达式不符合预期的Iterator [U_]类型
另外,第一个代码片段也无法在控制台面板中打印任何内容,为什么?
mapPartitions期望有一个函数返回一个新的分区迭代器(Iterator[Vector] => Iterator[NotInferedU]
),它将一个迭代器映射到另一个迭代器。通过使用foreach,您返回的空值(Scala中的Unit)与预期的返回类型不同。
要打印RDD内容,可以使用foreachPartition
代替mapPartitions
:
parsedData.foreachPartition(points =>
points.foreach(point =>
println(point)
)
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句