Scala Spark SQL通用数据集读取
我想为加载数据集创建一个通用特性:Scala Spark SQL通用数据集读取,scala,apache-spark,generics,apache-spark-sql,traits,Scala,Apache Spark,Generics,Apache Spark Sql,Traits,我想为加载数据集创建一个通用特性: case class Foo(name: String) trait Loader[T] { def load(implicit spark: SparkSession): Dataset[T] = { import spark.implicits._ spark.read .json(path) .as[T] .filter(filterDataset) } val path : Strin
case class Foo(name: String)
trait Loader[T] {
def load(implicit spark: SparkSession): Dataset[T] = {
import spark.implicits._
spark.read
.json(path)
.as[T]
.filter(filterDataset)
}
val path : String
val filterDataset : T => Boolean
}
object FooLoader extends Loader[Foo] {
val path = "/path/to/foo.json"
val filterDataset: Foo => Boolean = foo => foo.name.nonEmpty
}
这导致无法找到数据集中存储的类型的编码器。我可以通过将.as[T]
调用移动到对象来解决这个问题
trait Loader[T] {
def load(implicit spark: SparkSession): Dataset[T] = {
import spark.implicits._
toDS(
spark
.read
.json(path)
)
.filter(filterDataset)
}
val path : String
val filterDataset : T => Boolean
def toDS(df: DataFrame)(implicit spark: SparkSession): Dataset[T]
}
object FooLoader extends Loader[Foo] {
val path = "/path/to/foo.json"
val filterDataset: Foo => Boolean = foo => foo.name.nonEmpty
def toDS(df: DataFrame)(implicit spark: SparkSession): Dataset[Foo] = {
import spark.implicits._
df.as[Foo]
}
}
然而,这个解决方案需要在每个类中实现toDS
方法。我知道如何使用泛型函数实现泛型数据加载,例如,def[T]load=spark.read.json.as[T]
,但我的目标是使用泛型特性。如何告诉编译器类型T
有一个编码器