仅当在 main 方法之外定义案例类以创建 Dataset[case class] 或 Dataframe[case class]

Posted

技术标签:

【中文标题】仅当在 main 方法之外定义案例类以创建 Dataset[case class] 或 Dataframe[case class]【英文标题】:Working only when case class defined outside main method to create Dataset[case class] or Dataframe[case class] 【发布时间】: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 中,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

在这个问题ques1,ques2 中,人们回答将case class 移到main 之外。这个想法奏效了。但是,为什么它只有在 case class 移出 main 方法时才有效?

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于仅当在 main 方法之外定义案例类以创建 Dataset[case class] 或 Dataframe[case class]的主要内容,如果未能解决你的问题,请参考以下文章

如何获取导入的类以更改 main.py 标签样式表的属性 [关闭]

仅当在父元素上指定维度时才继承维度

仅当在 Android 中单击按钮后条件为真时才启动 Activity

仅当在 angularjs 中选择选项卡时如何调用函数(或指令)?

仅当在 iOS 7 弹出框内使用视图时,如何使视图背景透明?

仅当在 Java 中按下鼠标时如何让 mouseEntered 执行