假设我有以下数据框:
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)=>迭代器[(字符串,整数)]
我可以理解这是由于我的函数的输入,输出类型但是如何解决这个问题而发生的?
答案 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
}