簡體   English   中英

Spark:將mapPartition與Scala一起使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM