在 scala 中读取 csv 的通用 class

Generic class to read csv in scala

我是 Scala 的新手,我正在尝试构建一个可以读取多种类型的 csv 文件的框架,并且所有读取操作都将通过一个 class。例如,我有两种类型的 CSV:StudentProfessor,我正在做这样的事情。

abstract class Person
case class Student(name: String, major: String, marks: Double) extends Person
case class Professor(name: String, salary: Double) extends Person

我的 csv reader 看起来像这样

  private def readCsv[T: Encoder](location: String) = {
    spark
      .read
      .option("header", "true")
      .option("inferSchema", "true")
      .option("delimiter", ";")
      .csv(location)
      .as[T]
  }

def data:Dataset[Person](location) = readCsv[Person](location)

我在最后一行收到编译时错误 No implicit arguments of Type: Encoder[Person]。对此方法的调用如下所示:

val studentData = storage.data[Student]("Student.csv")

有没有更好的方法来实现这个?

  1. 您的 ADT 定义可能应该是 final/sealed 否则很难推导出 Encoders
  2. 很遗憾,IIRC Spark 不支持 Sum 类型,因为它没有模式表示。一个有点常见的 hack 是将 Either[A, B] 表示为 (Option[A], Option[B]) 但这是一个痛苦