spark隐含的参数多态性问题,值toDF不是Seq[T]的成员

vmpqdwk3  于 2023-04-07  发布在  Apache
关注(0)|答案(1)|浏览(192)

这是在scala 2.12.10和spark 2.4.8上。我试图定义一个trait,如下所示,带有一个方法,可以将某个case类的数组转换为dataframe。类型参数意味着某种模式。(case类),它扩展了QuestionSchema,因此是T <: schemas.QuestionSchema。我尝试导入spark implicits,以便在转换为sequence后将数据转换为dataframe,但似乎不起作用,有人能看出这里有什么问题吗?还有其他方法可以做到这一点吗?

trait DataStore {
  var data1 = Array.empty[Data1Type]
  var data2 = Array.empty[Data2Type]
  def convertToDf[T <: schemas.QuestionSchema](res: Array[T])(implicit spark: SparkSession): DataFrame = {
    import spark.implicits._
    res.toSeq.toDF()  // value toDF is not a member of Seq[T]
  }
}
ttcibm8c

ttcibm8c1#

添加上下文绑定org.apache.spark.sql.Encoder

def convertToDf[T <: schemas.QuestionSchema : Encoder]

问题是Spark定义了一个类型类Encoder的示例,例如,T是一个case类。在方法convertToDf中,T还不是一个case类,它目前只是一个抽象类型(更确切地说,方法参数)。在调用方法后,它将成为case类的类型。添加上下文绑定(与def convertToDf[T <: QuestionSchema](res: Array[T])(implicit spark: SparkSession, enc: Encoder[T])相同)将隐式解析从方法的定义位置推迟到调用位置。因此您应该在调用位置添加import spark.implicits._
How to resolve implicit lookup by bounded generic?
Typeclasses methods called in functions with type parameters
Why the Scala compiler can provide implicit outside of object, but cannot inside?
How to define induction on natural numbers in Scala 2.13?

相关问题