在呼叫mapPartitionsWithIndexspark 中呼叫的 api 時,我使用了帶有 case 的部分函式,??它作業得很好
val numbersRDD = sc.parallelize(numbers)
numbersRDD.mapPartitionsWithIndex{ case x: (Int,Iterator[Int]) => Iterator((x._1,x._2.size))}
當我明確地將其宣告為部分功能時,如下所示
val dosomething: PartialFunction[(Int,Iterator[Int]), Iterator[(Int,Any)]] = {
case x: (Int,Iterator[Int]) => Iterator((x._1,x._2.size))
}
numbersRDD.mapPartitionsWithIndex{dosomething}
編譯器開始抱怨。我不確定我做錯了什么。我可能在這里遺漏了一些東西。
uj5u.com熱心網友回復:
因為mapPartitionsWithIndex不接受偏函式而是函式。即使您在第一個代碼中提供了部分函式(實作),它也沒有明確鍵入為 PartialFunction,編譯器會將其推斷為 Function2。
但在第二段代碼中,由于您將其定義為 PartialFunction,編譯器無法將其轉換為 Function2,因此出現編譯錯誤。
為什么要傳遞 PartialFunction?的方法簽名mapPartitionsWithIndex顯然需要一個 Function 而不是 PartialFunction。
def mapPartitionsWithIndex[U: ClassTag](
f: (Int, Iterator[T]) => Iterator[U],
preservesPartitioning: Boolean = false): RDD[U]
PartialFunction 始終是 Function1,即它的型別為 A => B。Filter 接受 Function1,因此當您將部分函式傳遞給過濾器時,它不會給出編譯錯誤,因為您的部分函式也將類似于 A => Boolean。但是,方法 mapPartitionsWithIndex 需要 Function2 因此編譯錯誤。這可以在 scala REPL 中嘗試,如下所示:
// Notice the type function1 but mapPartitionsWithIndex expects Function2.
scala> val dosomething: PartialFunction[(Int, Iterator[Int]), Iterator[(Int, Any)]] = {
| case x: (Int, Iterator[Int]) => Iterator((x._1, x._2.size))
| }
val dosomething: PartialFunction[(Int, Iterator[Int]),Iterator[(Int, Any)]] = <function1>
// Since this is still function1, it's accepted inside filter. Also, this will still give you MatchError but not compilation.
scala> val dosomething1: PartialFunction[Int, Boolean] = {
| case x: Int if x > 10 => false
| }
val dosomething1: PartialFunction[Int,Boolean] = <function1>
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/512175.html
標籤:斯卡拉阿帕奇火花
下一篇:使用PySpark時獲取py4j.protocol.Py4JJavaError:java.lang.NoClassDefFoundError:scala/Product$class
