2015-03-19 18 views
14

Scala/Spark yığınında yeniyim ve SparkSql kullanarak temel becerilerimi nasıl test edeceğimi anlamaya çalışıyorum "map" TempTables ve viceversa'daki RDD'ler.Scala/Kıvılcım Uygulaması "No TypeTag available" ile "def main" tarzında bir hata oluştu. App

Aynı kodla birlikte 2 farklı .scala dosyam var: basit bir nesne (def ana ... ile) ve uygulamayı genişleten bir nesne.

basit nesne tek ben nedeniyle dosyamın sınıf giriş bağlı "yok TypeTag" bir hata alıyorum:

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

çizgisinde hata: log.registerTempTable("logs") "giriş için TypeTag müsait" diyor. Diğer dosyasında

(nesne App genişletir) tüm iyi çalışır:

Ben sadece iki ana noktaları alamıyorum başladım bu yana
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) 
} 

: 1) aynı kod iyi çalışır Neden ilk dosyada (basit nesne) hatayı alırken ikinci dosyada (nesne, uygulamayı genişlet) var mı?

2) (ve en önemlisi) Durum sınıfıyla ve TypeTag ile başa çıkmak için bu hatayı düzeltmek için kodumda (basit nesne dosyası) ne yapmalıyım (ki bunu bilmiyorum)?

Her cevap, kod örnekleri çok takdir edilecektir! peşin

Teşekkür

FF

cevap

41

TL; DR;

Sadece sorun case class Log kullanılmakta olduğu yöntemin içinde tanımlanmış olmasıdır yöntem tanımı

dışına vaka sınıfını taşıyın. Dolayısıyla, vaka sınıfı tanımınızı basitçe yöntemin dışına taşıyın ve işe yarayacaktır. Bunun nasıl derlendiğine bakmak zorundayım, ama tahminimce bu daha çok tavuk-yumurta problemidir. TypeTag (yansıma için kullanılır), bu noktada tam olarak tanımlanmadığından örtük olarak tanımlanamaz. Here are iki SO questions, Spark'in bir WeakTypeTag kullanması gerektiğini gösteren aynı sorunla. Ve, here is the JIRA bunu daha resmi olarak açıklayan

İlgili konular