无法使Spark在Intellij Idea中的scala工作表中运行

时间:2017-04-05 07:35:24

标签: scala apache-spark intellij-idea

以下代码运行时没有问题,如果我将其放在扩展App特征的对象中并使用Idea的run命令运行它。

但是,当我尝试从工作表中运行它时,我会遇到以下情况之一:

1-如果第一行存在,我得到:

  

任务不可序列化:java.io.NotSerializableException:A $ A34 $ A $ A34

2-如果第一行被注释掉,我得到:

  

无法为内部A $ A35 $ A $ A35 $ A12生成编码器   访问此类定义的范围。

//First line!
org.apache.spark.sql.catalyst.encoders.OuterScopes.addOuterScope(this)

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types.{IntegerType, StructField, StructType}

case class AClass(id: Int, f1: Int, f2: Int)
val spark = SparkSession.builder()
  .master("local[*]")
  .appName("Test App")
  .getOrCreate()
import spark.implicits._

val schema = StructType(Array(
  StructField("id", IntegerType),
  StructField("f1", IntegerType),
  StructField("f2", IntegerType)))

val df = spark.read.schema(schema)
  .option("header", "true")
  .csv("dataset.csv")

// Displays the content of the DataFrame to stdout
df.show()
val ads = df.as[AClass]

//This is the line that causes serialization error
ads.foreach(x => println(x))

该项目是使用Idea的Scala插件创建的,这是我的build.sbt:

   ...
   scalaVersion := "2.10.6"
   scalacOptions += "-unchecked"
   libraryDependencies ++= Seq(
       "org.apache.spark" % "spark-core_2.10" % "2.1.0",
       "org.apache.spark" % "spark-sql_2.10" % "2.1.0",
       "org.apache.spark" % "spark-mllib_2.10" % "2.1.0"
       )

我在this回答中尝试了解决方案。但它不适用于我正在使用的Idea Ultimate 2017.1,而且,当我使用工作表时,如果可能的话,我不想在工作表中添加额外的对象。

如果我在数据集对象上使用collect()方法并获得一个" Aclass"实例,也不会有更多错误。它试图直接使用DS导致错误。

1 个答案:

答案 0 :(得分:1)

使用eclipse兼容模式(打开Preferences->类型scala - >在Languages& Frameworks中,选择Scala - >选择工作表 - >只选择eclipse兼容模式)参见https://gist.github.com/RAbraham/585939e5390d46a7d6f8