繁体   English   中英

具有“No TypeTag available”的Scala / Spark应用程序“def main”样式App中的错误

[英]Scala/Spark App with “No TypeTag available” Error in “def main” style App

我是Scala / Spark堆栈的新手,我正试图弄清楚如何使用SparkSql来测试我的基本技能,以便在TempTables中“映射”RDD,反之亦然。

我有两个不同的.scala文件,具有相同的代码:一个简单的对象(使用def main ...)和一个扩展App的对象。

在简单的对象中,我得到一个错误,因为“No TypeTag available”连接到我的case类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)
}

行中的错误: log.registerTempTable("logs")表示“没有可用于日志的TypeTag”。

在另一个文件(对象扩展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)(最重要的)我应该怎么做我的代码(简单的目标文件)来修复这个错误,以便处理案例类和TypeTag(我几乎不知道)?

每个答案,代码示例将非常感谢!

提前致谢

FF

TL; DR;

只需将您的案例类移出方法定义即可

问题是您的case class Log是在正在使用它的方法内部定义的。 因此,只需将您的案例类定义移到方法之外,它就会起作用。 我将不得不看看这是如何编译的,但我的猜测是,这更像是鸡蛋问题。 TypeTag (用于反射)无法隐式定义,因为此时尚未完全定义。 以下是两个具有相同问题的SO问题,表明Spark需要使用WeakTypeTag 而且, 这是JIRA更正式地解释这一点

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM