![](/img/trans.png)
[英]scala match Class[X] works only with class defined outside case
[英]Working only when case class defined outside main method to create Dataset[case class] or Dataframe[case class]
这是有效的。
object FilesToDFDS {
case class Student(id: Int, name: String, dept:String)
def main(args: Array[String]): Unit = {
val ss = SparkSession.builder().appName("local").master("local[*]").getOrCreate()
import ss.implicits._
val path = "data.txt"
val rdd = ss.sparkContext.textFile(path).map(x => x.split(" ")).map(x => Student(x(0).toInt,x(1),x(2)))
val df = ss.read.format("csv").option("delimiter", " ").load(path).map(x => Student(x.getString(0).toInt ,x.getString(1),x.getString(2)))
val ds = ss.read.textFile(path).map(x => x.split(" ")).map(x => Student(x(0).toInt,x(1),x(2)))
val rddToDF = ss.sqlContext.createDataFrame(rdd)
}
}
但是,如果 case 类在 main, df
, ds
内移动,则会出现编译错误。
Unable to find encoder for type stored in a Dataset. Primitive types (Int, String, etc) and Product types (case classes) are supported by importing spark.implicits._ Support for serializing other types will be added in future releases.
并且rddToDF
给出了这个编译错误No TypeTag available for Student
在这个问题ques1 中, ques2 的人回答了在main
之外移动case class
。 这个想法奏效了。 但是,为什么它只在case class
移到 main 方法之外时才起作用?
我相信如果在另一个类中定义了一个案例类,那么它需要该类的一个实例才能正常工作。 在这种情况下,如果您将Student
类放在主类中,那么您将需要类似FilesToDFDS.Student
东西才能使其工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.