簡體   English   中英

Spark Scala數據集類型層次結構

[英]Spark Scala Dataset Type Hierarchy

嘗試執行擴展W的類以具有返回WR子類的數據集的方法get的方法。

abstract class WR

case class TGWR(
          a: String,
          b: String
        ) extends WR

abstract class W {

  def get[T <: WR](): Dataset[T]

}


class TGW(sparkSession: SparkSession) extends W {

  override def get[TGWR](): Dataset[TGWR] = {
    import sparkSession.implicits._

    Seq(TGWR("dd","dd").toDF().as[TGWR]
  }

}

編譯錯誤:

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.

如果我將get函數更改為以下內容:

  def get(): Dataset[TGWR]

  override def get(): Dataset[TGWR] = {...

它可以編譯-因此我懷疑由於繼承/類型層次結構而引起的問題。

忘了我的評論,我重新閱讀了您的問題,發現一個簡單的問題。

在這里override def get[TGWR]並不是說該類會生成TGWR實例,而是要創建一個名稱為TGWR的新類型參數 ,該參數TGWR您的真實類型。
我用以下代碼修復了它:

import org.apache.spark.sql.{SparkSession, Dataset}

abstract class WR extends Product with Serializable

final case class TGWR(a: String, b: String) extends WR

abstract class W[T <: WR] {
  def get(): Dataset[T]
}

final class TGW(spark: SparkSession) extends W[TGWR] {
  override def get(): Dataset[TGWR] = {
    import spark.implicits._
    Seq(TGWR("dd","dd")).toDF().as[TGWR]
  }
}

您可以使用此:

val spark = SparkSession.builder.master("local[*]").getOrCreate()
(new TGW(spark)).get()
// res1: org.apache.spark.sql.Dataset[TGWR] = [a: string, b: string]
res1.show()
// +---+---+
// |  a|  b|
// +---+---+
// | dd| dd|
// +---+---+

希望這是您想要的。
毫無疑問地要求澄清。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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