2015-03-19 7 views
14

Jestem nowy w stosie Scala/Spark i próbuję wymyślić jak przetestować swoje podstawowe umiejętności, używając SparkSql do "mapowania" RDD w TempTables i viceversa.Scala/Spark App z "No TypeTag available" Błąd w stylu "def main" App

Mam 2 różne pliki .scala z tym samym kodem: prosty obiekt (z def main ...) i obiekt rozszerzający aplikację.

W prosty przedmiot jednej pojawia się błąd ze względu na „nie” dostępnej TypeTag podłączony do mojego przypadku klasy 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) 
} 

Błąd w linii: log.registerTempTable("logs") mówi „Nie TypeTag dostępny dla Log”.

W innym pliku (obiektu rozciąga aplikacji) wszystko działa poprawnie:

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) 
} 

Ponieważ dopiero się rozpoczął, nie dostaję dwa główne punkty: 1) Dlaczego taką samą pracę kod grzywny w drugim pliku (aplikacja Object Extend), natomiast w pierwszym (obiekt prosty) pojawia się błąd?

2) (i najważniejsze) Co powinienem zrobić w moim kodzie (prosty plik obiektowy), aby naprawić ten błąd, aby poradzić sobie z klasą przypadków i TypeTag (który ledwo znam)?

Każda odpowiedź, przykłady kodu będą mile widziane!

góry dzięki

FF

Odpowiedz

41

TL; DR;

Wystarczy przenieść swoją klasę case z definicji metody

Problemem jest to, że case class Log jest zdefiniowana wewnątrz metody, że jest używany. Po prostu przenieś definicję klasy spraw poza metodę i to zadziała. Będę musiał przyjrzeć się, jak to się kompiluje, ale domyślam się, że jest to bardziej problem z jajkiem kurzym. TypeTag (używany do odbicia) nie może być niejawnie zdefiniowany, ponieważ nie został w pełni zdefiniowany w tym punkcie. Here are dwa SO questions z tym samym problemem, który wykazuje, że Spark będzie musiał użyć WeakTypeTag. I, here is the JIRA objaśniając to bardziej oficjalnie