Spark Scala 数据集类型层次结构
Spark Scala Dataset Type Hierarchy
尝试强制 类 扩展 W 以使用一种方法获取 returns WR 子类的数据集。
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] = {...
它编译 - 因此我怀疑是由于 inheritance/type 层次结构引起的问题。
忘记我的评论,我重新阅读了你的问题并注意到了一个简单的问题。
这里 override def get[TGWR]
你并不是说这个 class 产生了 TGWR
的实例,而是你正在创建一个新的 类型参数 name 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|
// +---+---+
希望这就是您要找的。
不疑求明。
尝试强制 类 扩展 W 以使用一种方法获取 returns WR 子类的数据集。
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] = {...
它编译 - 因此我怀疑是由于 inheritance/type 层次结构引起的问题。
忘记我的评论,我重新阅读了你的问题并注意到了一个简单的问题。
这里 override def get[TGWR]
你并不是说这个 class 产生了 TGWR
的实例,而是你正在创建一个新的 类型参数 name 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|
// +---+---+
希望这就是您要找的。
不疑求明。