【发布时间】:2018-09-16 03:13:48
【问题描述】:
这是有效的。
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 中,人们回答将case class 移到main 之外。这个想法奏效了。但是,为什么它只有在 case class 移出 main 方法时才有效?
【问题讨论】:
标签: scala apache-spark dataframe