Общий класс для чтения CSV в Scala - PullRequest
0 голосов
/ 06 ноября 2018

Я новичок в 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)

Я получаю ошибку времени компиляции в последней строке как No implicit arguments of Type: Encoder[Person]. Вызов этого метода выглядит примерно так:

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

Есть ли лучший способ добиться этого?

1 Ответ

0 голосов
/ 06 ноября 2018
  1. Ваше определение ADT, вероятно, должно быть окончательным / запечатанным, иначе трудно получить Encoders для него.
  2. IIRC Spark не поддерживает типы Sum, к сожалению, потому что для него нет представления схемы. Несколько распространенным хаком является представление Either[A, B] как (Option[A], Option[B]), но да, это боль
...