如何解决Spark SQL通用数据集读取
我想创建一个用于加载数据集的通用特征:
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
}
结果为Unable to find encoder for type stored in Dataset
。我可以通过将.as[T]
调用移至实现Loader特征的对象来解决此问题。
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]
}
}
但是,此解决方案要求在每个扩展Loader特征的类中实现toDS
方法。我知道如何使用通用函数(即。)来实现通用数据加载。 def[T] load = spark.read.json.as[T]
,但是我的目标是使用通用特征。如何告诉编译器类型为T
的编码器?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。