【问题标题】:spark generic dataframe to dataSet type parameter bounds将通用数据框触发到数据集类型参数范围
【发布时间】: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


【解决方案1】:

我求助于:

trait SparkDatasetProvider[T, C <: BaseConfiguration] {

  def provide(spark: SparkSession, c: C): Dataset[T]

}
trait SparkDataFrameProvider[C <: BaseConfiguration] extends SparkDatasetProvider[Row, C] {
  def provide(spark: SparkSession, c: C): DataFrame

}

即删除Product

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多