scala - 在 scala 中读取 csv 的通用类

标签 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)

我在最后一行收到编译时错误:没有类型为 Encoder[Person] 的隐式参数。对此方法的调用如下所示:

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

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

最佳答案

  1. 您的 ADT 定义可能应该是最终/密封的,否则很难为其派生编码器
  2. 遗憾的是,IIRC Spark 不支持 Sum 类型,因为它没有模式表示。一种常见的黑客方法是将 Either[A, B] 表示为 (Option[A], Option[B]) 但这是一个痛苦

关于scala - 在 scala 中读取 csv 的通用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53162415/

相关文章:

scala - java.lang.RuntimeException : You must run the `stage` task before deploying your app when running `sbt stage deployHeroku` 错误

php - 使用 PHP 将 CSV 上传并存储到 mysql 数据库中

java - 在 Java 中,类 B<T> 扩展 A<T> 和类 B<T> 扩展 A 之间有什么区别

scala - 在 Scala 中使用隐式的良好实践

scala - 如何使用反射实例化 Scala 对象

python - 在Python中获取波兰语字符

csv - 数据管道 : Use only first 4 values from CSV in pipeline

ios - 将 JSON 字符串解析为基于 iOS 类的对象

java - 使用嵌套泛型和继承编译错误

scala - IntelliJ 上的 SBT 需要很长时间才能刷新