如何在Scala中使用mapPartitions?

时间:2015-07-24 08:15:26

标签: java scala hadoop apache-spark

我正在尝试在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的正确方法是什么?

2 个答案:

答案 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