[FIXED] Scala Partial Function funktioniert nicht mit Spark MapPartitionsWithIndex

Ausgabe

Beim Aufrufen einer mapPartitionsWithIndexin Spark aufgerufenen API habe ich eine Teilfunktion mit Fall verwendet, die ziemlich gut funktioniert

val numbersRDD = sc.parallelize(numbers)
      numbersRDD.mapPartitionsWithIndex{ case x: (Int,Iterator[Int]) => Iterator((x._1,x._2.size))}

Wenn ich es explizit als Teilfunktion wie unten deklariert habe

val dosomething: PartialFunction[(Int,Iterator[Int]), Iterator[(Int,Any)]] = {
    case x: (Int,Iterator[Int]) => Iterator((x._1,x._2.size))
  }
  numbersRDD.mapPartitionsWithIndex{dosomething}

Complier fängt an zu meckern. Ich bin mir nicht sicher, was ich falsch mache. Vielleicht fehlt mir hier etwas.

Lösung

Weil mapPartitionsWithIndexakzeptiert keine Teilfunktion, sondern eine Funktion. Obwohl Sie in Ihrem ersten Code eine partielle Funktion (Implementierung) bereitstellen, ist diese nicht ausdrücklich als PartialFunction typisiert, und der Compiler leitet sie als Function2 ab.

Da Sie es jedoch im zweiten Codeabschnitt als PartialFunction definiert haben, kann der Compiler es nicht in Function2 konvertieren, daher der Kompilierungsfehler.

Warum möchten Sie eine PartialFunction übergeben? Die Methodensignatur von mapPartitionsWithIndexerwartet eindeutig eine Funktion und keine PartialFunction.

  def mapPartitionsWithIndex[U: ClassTag](
      f: (Int, Iterator[T]) => Iterator[U],
      preservesPartitioning: Boolean = false): RDD[U]

PartialFunction ist IMMER eine Funktion1, dh sie ist vom Typ A => B. Filter akzeptiert eine Funktion1 und daher, wenn Sie eine Teilfunktion an Filter übergeben, gibt es keinen Kompilierungsfehler, da Ihre Teilfunktion auch etwas wie A => Boolean sein wird. Die Methode mapPartitionsWithIndex erwartet jedoch Function2, daher der Kompilierungsfehler. Dies kann in scala REPL wie folgt ausprobiert werden:

// 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>



Beantwortet von –
Mrunal Badhe


Antwort geprüft von –
Marie Seifert (FixError Admin)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like