【发布时间】:2018-11-09 10:48:01
【问题描述】:
我有一个类似的功能:
def createDataset[T](seq:Seq[T]): Dataset[T] = {
import spark.implicits._
seq.toDS()
}
这不是编译,它没有找到 toDS 函数。
这样也行不通
def createDataset[T](t:T): Dataset[T] = {
import spark.implicits._
Seq(t).toDS()
}
我使用的案例类是
case class Person(id: Long, name: String, age: Int) {}
case class Address(a_id:Long, street:String, number: Int) {}
如果给定一个 T 泛型类(它始终是一个案例类),我可以做一个 generic 函数来创建一个 Dataset?
编辑:
Terry Dactyl 提供的解决方案对我不起作用,并在调用 f 函数时显示此错误
import org.apache.spark.sql.{Dataset, Encoder, SparkSession}
def f[T <: Product : Encoder](s: Seq[T]): Dataset[T] = {
val spark = SparkSession.builder.getOrCreate()
import spark.implicits._
s.toDF.as[T]
}
f(Seq(
Person(1, "John", 25)
Person(2, "Paul", 22)
))
没有找到参数 ev$1 的隐含:Encoder[Person]
【问题讨论】:
-
您没有正确使用解决方案。在函数内部创建会话并在其闭包中引入隐式
Encoder不会将Encoder[T]引入外部范围。必须在答案中提供隐含(在闭包之外)。
标签: scala apache-spark generics apache-spark-dataset