我是 Scala 新手,我正在尝试构建一个可以读取多种类型的 csv 文件的框架,并且所有读取操作都将通过一个类。例如,我有两种类型的 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 阅读器看起来像这样
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)
我在最后一行收到编译时错误:没有类型为 Encoder[Person] 的隐式参数
。对此方法的调用如下所示:
val studentData = storage.data[Student]("Student.csv")
有没有更好的方法来实现这个目标?
最佳答案
- 您的 ADT 定义可能应该是最终/密封的,否则很难为其派生
编码器
。 - 遗憾的是,IIRC Spark 不支持 Sum 类型,因为它没有模式表示。一种常见的黑客方法是将
Either[A, B]
表示为(Option[A], Option[B])
但这是一个痛苦
关于scala - 在 scala 中读取 csv 的通用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53162415/