Универсальный класс для чтения csv в scala

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

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


person Harshad_Pardeshi    schedule 05.11.2018    source источник
comment
Ошибка сообщает вам, что вам нужно указать неявный аргумент. Вы можете сделать это тремя способами: (1) путем определения implicit val в области действия, или (2) путем определения implicit class, или (3) путем явной передачи аргумента mising Encoder во вторичном списке аргументов.   -  person Robin Green    schedule 06.11.2018
comment
Когда вы получаете сообщение об ошибке, полезно включить в вопрос эту ошибку и любые связанные с ней трассировки стека. Дополнительные советы о том, как написать хороший вопрос, см. На странице stackoverflow.com/help/how-to-ask   -  person Geoffrey Wiseman    schedule 06.11.2018
comment
Я получаю сообщение об ошибке времени компиляции No implicit arguments of Type: Encoder[Person] в строке def data:Dataset[Person](location) = readCsv[Person](location)   -  person Harshad_Pardeshi    schedule 06.11.2018
comment
Кажется связанным - stackoverflow.com/a/41082540/864369 и stackoverflow.com/a/32454596/864369   -  person Dan W    schedule 06.11.2018


Ответы (1)


  1. ваше определение ADT, вероятно, должно быть окончательным / запечатанным, иначе для него будет трудно вывести Encoders.
  2. К сожалению, IIRC Spark не поддерживает типы Sum, потому что для него нет схемы. Довольно распространенный способ взлома - представить Either[A, B] как (Option[A], Option[B]), но да, это больно
person Dominic Egger    schedule 06.11.2018