如何从存储的(变量或参数)Seq创建数据集

时间:2018-11-09 10:48:02

标签: scala apache-spark generics apache-spark-dataset

我有一个类似的功能:

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泛型类(始终为案例类)的情况下创建数据集?

修改

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]

1 个答案:

答案 0 :(得分:1)

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]