这很有效。
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)
}
}
但是,如果案例类在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人回答将case class
移到main
之外。这个想法奏效了。但是,为什么只有当case class
移到main方法之外时它才起作用?
答案 0 :(得分:0)
我相信,如果在另一个类中定义了一个案例类,则它需要该类的实例才能正常工作。在这种情况下,如果将Student
类放在主类中,则需要FilesToDFDS.Student
之类的东西才能使它工作。