我是Scala / Spark堆栈的新手,我正试图弄清楚如何使用SparkSql测试我的基本技能,以及#34; map" TempTables中的RDD,反之亦然。
我有2个不同的.scala文件,代码相同:一个简单的对象(使用def main ...)和一个扩展App的对象。
在简单对象中,由于"没有TypeTag可用而导致错误"连接到我的案例类日志:
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)
}
行上的错误:log.registerTempTable("logs")
说"没有TypeTag可用于Log"。
在另一个文件(object extends App)中,一切正常:
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)为什么相同的代码在第二个文件(对象扩展App)中正常工作,而在第一个(简单对象)中我得到错误?
2)(最重要的)我应该怎么做我的代码(简单的目标文件)来修复这个错误,以便处理case类和TypeTag(我几乎不知道)?
每个答案,代码示例都将非常感谢!
提前致谢
FF
答案 0 :(得分:51)
<强> TL; DR; 强>
将案例类移出方法定义
问题是您的case class Log
是在使用它的方法中定义的。因此,只需将您的案例类定义移到方法之外,它就会起作用。我将不得不看看这是如何编译的,但我的猜测是,这更像是鸡蛋问题。 TypeTag
(用于反射)无法隐式定义,因为此时尚未完全定义。 Here are两个SO questions具有相同的问题,表明Spark需要使用WeakTypeTag
。并且,here is the JIRA更正式地解释了这一点