如何从存储的(变量或参数)Seq 创建数据集
How to create dataset from stored (variable or parameter) Seq
我有这样的功能:
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()
}
我使用的 class 是
case class Person(id: Long, name: String, age: Int) {}
case class Address(a_id:Long, street:String, number: Int) {}
我可以做些什么来获得一个 generic 函数,该函数在给定 T generic class 的情况下创建数据集,这总是 class?
编辑:
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 的隐含项:编码器 [Person]
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]
我有这样的功能:
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()
}
我使用的 class 是
case class Person(id: Long, name: String, age: Int) {}
case class Address(a_id:Long, street:String, number: Int) {}
我可以做些什么来获得一个 generic 函数,该函数在给定 T generic class 的情况下创建数据集,这总是 class?
编辑:
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 的隐含项:编码器 [Person]
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]