关于Scala:如何从存储的(变量或参数)Seq中创建数据集

How to create dataset from stored (variable or parameter) Seq

本问题已经有最佳答案,请猛点这里访问。

我有一个类似的功能:

1
2
3
4
def createDataset[T](seq:Seq[T]): Dataset[T] = {
    import spark.implicits._
    seq.toDS()
}

这没有编译,没有找到toDS功能。

它也不能以这种方式工作

1
2
3
4
def createDataset[T](t:T): Dataset[T] = {
    import spark.implicits._
    Seq(t).toDS()
}

我正在使用的案例类是

1
2
case class Person(id: Long, name: String, age: Int) {}
case class Address(a_id:Long, street:String, number: Int) {}

我可以做些什么,让一个通用函数创建一个给定的T通用类(总是一个case类)的数据集?

编辑:

Terry Dactyl提供的解决方案不适用于我,并且在调用f函数时显示此错误

1
2
3
4
5
6
7
8
9
10
11
12
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]


1
2
3
4
5
6
7
8
9
10
11
import org.apache.spark.sql._
import spark.implicits._

def f[T <: Product : Encoder](s: Seq[T]): Dataset[T] = {
  s.toDF.as[T]
}
case class C(a: Int, b: Int)

f(Seq(C(1, 2), C(3, 4), C(5, 6)))

res0: org.apache.spark.sql.Dataset[C] = [a: int, b: int]