2015-03-19 7 views
14

Ich bin neu in Scala/Spark stack und ich versuche herauszufinden, wie man meine grundlegenden Fähigkeiten mit SparkSql zu "map" RDDs in TempTables und umgekehrt.Scala/Spark App mit "No TypeTag available" Fehler in "def main" style App

Ich habe 2 verschiedene .scala-Dateien mit dem gleichen Code: ein einfaches Objekt (mit def main ...) und ein Objekt, das App erweitert. ein

Im einfachen Objekt bekomme ich einen Fehler aufgrund von „No TypeTag verfügbar“ mit meinem Fall Klasse Log:

object counter { 
    def main(args: Array[String]) { 
. 
. 
. 
    val sqlContext = new org.apache.spark.sql.SQLContext(sc) 
    import sqlContext.createSchemaRDD 
    case class Log(visitatore: String, data: java.util.Date, pagina: String, count: Int) 
    val log = triple.map(p => Log(p._1,p._2,p._3,p._4)) 
    log.registerTempTable("logs") 
    val logSessioni= sqlContext.sql("SELECT visitor, data, pagina, count FROM logs") 
    logSessioni.foreach(println) 
} 

Der Fehler in Zeile: log.registerTempTable("logs") sagt „Nein TypeTag für Log verfügbar“.

In der anderen Datei (Objekt erweitert App) alles funktioniert gut:

object counterApp extends App { 
. 
. 
. 
val sqlContext = new org.apache.spark.sql.SQLContext(sc) 
    import sqlContext.createSchemaRDD 
    case class Log(visitatore: String, data: java.util.Date, pagina: String, count: Int) 
    val log = triple.map(p => Log(p._1,p._2,p._3,p._4)) 
    log.registerTempTable("logs") 
    val logSessioni= sqlContext.sql("SELECT visitor, data, pagina, count from logs") 
    logSessioni.foreach(println) 
} 

Da ich gerade erst begonnen habe, bin ich nicht zwei Punkte: 1) Warum hat die gleichen Code funktioniert in der zweiten Datei (Objekt App erweitern) während in der ersten (einfaches Objekt) bekomme ich den Fehler?

2) (und am wichtigsten) Was soll ich in meinem Code (einfache Objektdatei) tun, um diesen Fehler zu beheben, um Fallklasse und TypeTag (die ich kaum kenne) zu behandeln?

Jede Antwort, Codebeispiele werden sehr geschätzt!

Vielen Dank im Voraus

FF

Antwort

41

TL; DR;

einfach Ihre Fallklasse bewegen aus der Methodendefinition

Das Problem ist, dass Ihre case class Log innerhalb des Verfahrens definiert ist, dass es verwendet wird. Verschieben Sie also einfach Ihre Fallklassendefinition außerhalb der Methode und es wird funktionieren. Ich werde einen Blick darauf werfen müssen, wie sich das zusammensetzt, aber ich vermute, dass dies eher ein Hühnerei-Problem ist. Die TypeTag (zur Reflexion verwendet) kann nicht implizit definiert werden, da sie zu diesem Zeitpunkt noch nicht vollständig definiert wurde. Here are zwei SO questions mit dem gleichen Problem, die zeigen, dass Spark eine WeakTypeTag verwenden müsste. Und, here is the JIRA, die diese amtlichere

erklären