2015-03-19 16 views
14

Tôi mới dùng Scala/Spark stack và tôi đang cố gắng tìm ra cách kiểm tra các kỹ năng cơ bản của mình bằng cách sử dụng SparkSql để "ánh xạ" RDD trong TempTables và viceversa.Scala/Spark App với lỗi "No TypeTag available" trong kiểu "def chính" App

Tôi có 2 tệp .scala riêng biệt có cùng mã: một đối tượng đơn giản (có def chính ...) và đối tượng mở rộng ứng dụng.

Trong các đối tượng đơn giản mà tôi nhận được một lỗi do "Không TypeTag sẵn" kết nối với trường hợp lớp Log của tôi:

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

Lỗi tại dòng: log.registerTempTable("logs") nói "Không TypeTag sẵn cho Log".

Trong tập tin khác (đối tượng mở rộng App) tất cả hoạt động tốt:

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

Kể từ khi tôi chỉ mới bắt đầu, tôi không nhận được hai điểm chính: 1) Tại sao cùng tốt công việc mã trong tập tin thứ hai (đối tượng mở rộng App) trong khi trong một đầu tiên (đối tượng đơn giản) tôi nhận được lỗi?

2) (và quan trọng nhất) Tôi nên làm gì trong mã của tôi (tệp đối tượng đơn giản) để khắc phục lỗi này để đối phó với trường hợp lớp và TypeTag (mà tôi hầu như không biết)?

Mỗi câu trả lời, các ví dụ mã sẽ được đánh giá cao!

Cảm ơn trước

FF

Trả lời

41

TL; DR;

Chỉ cần di chuyển lớp trường hợp của bạn ra khỏi định nghĩa phương pháp

Vấn đề là case class Log của bạn được định nghĩa bên trong của phương pháp mà nó đang được sử dụng. Vì vậy, chỉ cần di chuyển định nghĩa lớp vỏ của bạn bên ngoài phương thức và nó sẽ hoạt động. Tôi sẽ phải xem xét cách thức biên dịch này xuống, nhưng tôi đoán là đây là vấn đề về trứng gà hơn. Các TypeTag (được sử dụng để phản ánh) là không thể được xác định ngầm như nó đã không được xác định đầy đủ tại thời điểm đó. Here are hai SO questions với cùng một vấn đề thể hiện Spark sẽ cần sử dụng WeakTypeTag. Và, here is the JIRA giải thích chính thức hơn này