2017-09-10 5 views
1

Ich bin neu zu funken und scala und ich habe mit scala einen Fehler bei der Kompilierung: Let's sagen wir ein rdd haben, die eine Karte ist wie folgt:Funken: Werthistogramm ist kein Mitglied von org.apache.spark.rdd.RDD [Option [Beliebig]]

val rawData = someRDD.map{ 
    //some ops 
    Map(
    "A" -> someInt_var1 //Int 
    "B" -> someInt_var2 //Int 
    "C" -> somelong_var //Long 
    ) 
} 

Dann habe ich Histogramm Informationen dieser vars erhalten möchten. So, hier ist mein Code:

rawData.map{row => row.get("A")}.histogram(10) 

Und der Compiler-Fehler sagt:

Wert-Histogramm ist kein Mitglied von org.apache.spark.rdd.RDD [Option [Alle]]

Ich frage mich, warum rawData.map{row => row.get("A")} ist org.apache.spark.rdd.RDD[Option[Any]] und wie man es in rdd [Int] transformieren? Ich habe wie folgt versucht:

rawData.map{row => row.get("A")}.map{_.toInt}.histogram(10) 

Aber es kompiliert fehlschlagen:

Wert toInt kein Mitglied der Option ist [Alle]

Ich bin total verwirrt und sucht nach hilfe hier.

Antwort

2

Sie erhalten Option, weil Map.get eine Option zurückgibt; Map.get gibt None zurück, wenn der Schlüssel nicht in der Map existiert; Und Option[Any] bezieht sich auch auf die verschiedenen Datentypen des Kartenwerts, Sie haben beide Int und Long, in meinem Fall gibt AnyVal statt Any zurück;

Eine mögliche Lösung ist getOrElse loswerden Option erhalten verwenden, indem Sie einen Standardwert bereitstellt, wenn der Schlüssel nicht existiert, und wenn Sie sicher sind, A ‚s-Wert ist immer ein int, können Sie es AnyVal-Int konvertieren unter Verwendung von asInstanceOf[Int];

Ein vereinfachtes Beispiel, wie folgt:

val rawData = sc.parallelize(Seq(Map("A" -> 1, "B" -> 2, "C" -> 4L))) 

rawData.map(_.get("A")) 
// res6: org.apache.spark.rdd.RDD[Option[AnyVal]] = MapPartitionsRDD[9] at map at <console>:27 

rawData.map(_.getOrElse("A", 0).asInstanceOf[Int]).histogram(10) 
// res7: (Array[Double], Array[Long]) = (Array(1.0, 1.0),Array(1)) 
Verwandte Themen