【发布时间】:2018-12-10 07:56:44
【问题描述】:
Spark 在内部将DataFrame 表示为Dataset[Row]。
现在我必须输入:
SparkDatasetProvider[T <: Product, C <: BaseConfiguration]
SparkDataFrameProvider[C <: BaseConfiguration]
extends SparkDatasetProvider[Row, C]
即我想确保支持Dataset[T] 和常规Row 的案例类。
我该如何解决:
type arguments [org.apache.spark.sql.Row,C] do not conform to trait SparkDatasetProvider's type parameter bounds
因为我不知道结合了Row 和常规case classes 的超类。
编辑
trait SparkDatasetProvider[T <: Encoder[T]] {
def provide(spark: SparkSession): Dataset[T]
}
trait SparkDataFrameProvider extends SparkDatasetProvider[Row, C] {
override def provide(spark: SparkSession): DataFrame
}
object FooProvider extends SparkDataFrameProvider{
override def provide(spark: SparkSession): DataFrame = null
}
final case class FooFeed(foo:Int, bar:String)
object FooProviderC extends SparkDatasetProvider[FooFeed]{
override def provide(spark: SparkSession): Dataset[FooFeed] = null
}
type parameter bounds [T <: org.apache.spark.sql.Encoder[T]]
object FooProviderC extends SparkDatasetProvider[FooFeed]{
按照建议 - 但是,我无法让它工作。
【问题讨论】:
-
我认为您可以改用
[T: Encoder],因为Spark 真正需要的是Encoder。 -
您为什么希望它起作用?
Row不是Product所以extends SparkDatasetProvider[Row, C]没有意义。 -
完全正确 - 我不知道有一个常见的超级类型的编码器。
-
@user6910411 请查看编辑。对于
Encoder[T],我仍然遇到相同的编译错误。 -
@GeorgHeiler 现在类型参数的数量不匹配,因此您的编辑不应出现相同的错误。
标签: scala apache-spark generics