Spark:使用带Scala的mapPartition

时间:2016-07-29 18:01:11

标签: scala apache-spark

假设我有以下数据框:

var randomData = Seq(("a",8),("h",5),("f",3),("a",2),("b",8),("c",3)
val df = sc.parallelize(randomData,2).toDF()

我正在使用这个函数,它将是mapPartition

的输入
def trialIterator(row:Iterator[(String,Int)]): Iterator[(String,Int)] =
    row.toArray.tail.toIterator

使用地图分区:

df.mapPartition(trialIterator)

我收到以下错误消息:

  

类型不匹配,预期(迭代器[行])=> Iterator [NotInferedR],actual:Iterator [(String,Int)=>迭代器[(字符串,整数)]

我可以理解这是由于我的函数的输入,输出类型但是如何解决这个问题而发生的?

2 个答案:

答案 0 :(得分:5)

如果您想获得强类型输入,请不要使用Dataset[Row]DataFrame),而Dataset[T]此特定情况下的T(String, Int)。如果不知道分区是否为空,也不要转换为Array并且不要盲目调用tail

def trialIterator(iter: Iterator[(String, Int)]) = iter.drop(1)

randomData
  .toDS // org.apache.spark.sql.Dataset[(String, Int)]
  .mapPartitions(trialIterator _)

randomData.toDF // org.apache.spark.sql.Dataset[Row] 
  .as[(String, Int)] // org.apache.spark.sql.Dataset[(String, Int)]
  .mapPartitions(trialIterator _)

答案 1 :(得分:0)

您期望Iterator[(String,Int)]

时期望Iterator[Row]类型
def trialIterator(row:Iterator[Row]): Iterator[(String,Int)] = {
    row.next()
    row //seems to do the same thing w/o all the conversions
}