在scala中读取csv的泛型类

时间:2018-11-05 21:21:18

标签: scala csv generics case-class

我是Scala的新手,我正在尝试构建一个框架,该框架可以读取多种类型的csv文件,并且所有读取操作将通过一个类。例如,我有两种类型的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阅读器看起来像这样

  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 个答案:

答案 0 :(得分:2)

  1. 您的ADT定义应该是最终的/密封的,否则很难得出Encoders
  2. 可悲的是,IIRC Spark不支持Sum类型,因为它没有模式表示。一种常见的破解方法是将Either[A, B]表示为(Option[A], Option[B]),但是的,这很痛苦