[英]Spark: Using mapPartition with Scala
假設我有以下數據幀:
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 [Row])=> Iterator [NotInferedR],actual:Iterator [(String,Int)=> Iterator [(String,Int)]
我可以理解這是由於我的函數的輸入,輸出類型但是如何解決這個問題?
如果要獲得強類型輸入,請不要使用Dataset[Row]
( DataFrame
),而是使用Dataset[T]
,其中此特定情況下的T
為(String, Int)
。 也不要轉換為Array
,不要盲目調用tail
而不知道partition是否為空:
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 _)
你期望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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.