Есть две вещи, на которые следует обратить внимание:
- имена классов должны быть в
CamelCase
, поэтому InfoData
. - После того, как вы связали тип с
DataSet
, это не DataFrame
.DataFrame
- это специальное имя для DataSet
общего назначения Row
.
Вам нужно убедиться, что у вашего предоставленного класса есть неявный экземпляр соответствующего Encoder
в текущей области видимости.
case class InfoData(colA: Int, colB: String)
Encoder
экземпляров для примитивных типов (Int
, String
и т. Д.) И case classes
можно получить, импортировав spark.implicits._
def readCsv[T](path: String)(implicit encoder: Encoder: T): Dataset[T] = {
spark
.read
.option("header", "true")
.csv(path)
.as[T]
}
Или, вы можете использовать контекстное ограничение,
def readCsv[T: Encoder[T]](path: String): Dataset[T] = {
spark
.read
.option("header", "true")
.csv(path)
.as[T]
}
Теперь вы можете использовать его следующим образом,
val spark = ...
import spark.implicits._
def readCsv[T: Encoder[T]](path: String): Dataset[T] = {
spark
.read
.option("header", "true")
.csv(path)
.as[T]
}
val infoDS = readCsv[InfoData]("/src/main/info.csv")