在 scala 中读取 csv 的通用 class
Generic class to read csv in scala
我是 Scala 的新手,我正在尝试构建一个可以读取多种类型的 csv 文件的框架,并且所有读取操作都将通过一个 class。例如,我有两种类型的 CSV:Student
和 Professor
,我正在做这样的事情。
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")
有没有更好的方法来实现这个?
- 您的 ADT 定义可能应该是 final/sealed 否则很难推导出
Encoders
。
- 很遗憾,IIRC Spark 不支持 Sum 类型,因为它没有模式表示。一个有点常见的 hack 是将
Either[A, B]
表示为 (Option[A], Option[B])
但这是一个痛苦
我是 Scala 的新手,我正在尝试构建一个可以读取多种类型的 csv 文件的框架,并且所有读取操作都将通过一个 class。例如,我有两种类型的 CSV:Student
和 Professor
,我正在做这样的事情。
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")
有没有更好的方法来实现这个?
- 您的 ADT 定义可能应该是 final/sealed 否则很难推导出
Encoders
。 - 很遗憾,IIRC Spark 不支持 Sum 类型,因为它没有模式表示。一个有点常见的 hack 是将
Either[A, B]
表示为(Option[A], Option[B])
但这是一个痛苦