簡體   English   中英

僅當在 main 方法之外定義 case 類以創建 Dataset[case class] 或 Dataframe[case class] 時才工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM