如果我将它放在扩展App特征的对象中并使用Idea的run命令运行它,则以下代码运行没有问题.
但是,当我尝试从工作表运行它时,我会遇到以下情况之一:
1-如果第一行存在,我得到:
Task not serializable: java.io.NotSerializableException:A$A34$A$A34
2-如果第一行被注释掉,我得到:
Unable to generate an encoder for inner class A$A35$A$A35$A12 without
access to the scope that this class was defined in.
//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导致错误.
最佳答案 使用eclipse兼容模式(打开Preferences->类型scala – >在Languages& Frameworks中,选择Scala – >选择Worksheet – >只选择eclipse兼容模式)参见
https://gist.github.com/RAbraham/585939e5390d46a7d6f8