仅在主方法外定义的case类创建Dataset [case class]或Dataframe [case class]时才工作

时间:2018-04-06 06:42:33

标签: scala apache-spark dataframe

这很有效。

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中移动,dfds会出现编译错误。

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

在这些问题中ques1ques2人回答将case class移到main之外。这个想法奏效了。但是,为什么只有当case class移到main方法之外时它才起作用?

1 个答案:

答案 0 :(得分:0)

我相信,如果在另一个类中定义了一个案例类,则它需要该类的实例才能正常工作。在这种情况下,如果将Student类放在主类中,则需要FilesToDFDS.Student之类的东西才能使它工作。