我正在尝试在Scala中使用mapPartitions
,但收到以下错误。
[error] found : Unit
[error] required: Iterator[?]
[error] Error occurred in an application involving default arguments.
[error] rdd.mapPartitions(showParts)
我按如下方式调用mapPartitions
函数。
rdd.mapPartitions(showParts)
其中showParts
函数定义如下。
def showParts(iter: Iterator[(Long, Array[String])]) =
{
while (iter.hasNext)
{
val cur = iter.next;
// Do something with cur
}
}
在这里使用mapPartitions
的正确方法是什么?
答案 0 :(得分:2)
问题是您传递给mapPartitions
的UDF必须具有Iterator[U]
的返回类型。您当前的代码不会返回任何内容,因此类型为Unit
。
如果您想在执行RDD
后获得空mapPartitions
,那么您可以执行以下操作:
def showParts(iter: Iterator[(Long, Array[String])]) =
{
while (iter.hasNext)
{
val cur = iter.next;
// Do something with cur
}
// return Iterator[U]
Iterator.empty
}
答案 1 :(得分:1)
您需要从showParts
函数返回def onlyEven(numbers: Iterator[Int]) : Iterator[Int] =
numbers.filter(_ % 2 == 0)
def partitionSize(numbers: Iterator[Int]) : Iterator[Int] =
Iterator.single(numbers.length)
val rdd = sc.parallelize(0 to 10)
rdd.mapPartitions(onlyEven).collect()
// Array[Int] = Array(0, 2, 4, 6, 8, 10)
rdd.mapPartitions(size).collect()
// Array[Int] = Array(2, 3, 3, 3)
。
post_submit.html