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

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

在一个简单的对象中,由于连接到案例类Log的“无可用的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”。

在另一个文件中(对象扩展了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

最佳答案

TL; DR;

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

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

关于scala - 带有 “No TypeTag available”的Scala/Spark应用程序 “def main”风格的应用程序出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29143756/

10-09 05:38