【问题标题】:How to create dataset from stored (variable or parameter) Seq [duplicate]如何从存储的(变量或参数)序列创建数据集 [重复]
【发布时间】: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


【解决方案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]

【讨论】:

  • 没有找到参数 ev$1 的隐式:编码器[MyType]
  • 您能否编辑您的原始帖子以添加一个失败的示例或至少提供 MyType 的定义?
  • “失败的例子”是什么意思?我正在使用的案例类?所有的真实代码?
  • 所以至少要定义你的案例类。理想情况下是一个独立的程序
猜你喜欢
  • 2016-12-08
  • 2019-07-20
  • 2022-11-30
  • 2020-05-08
  • 2018-09-29
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
相关资源
最近更新 更多