аргументы типа [T] не соответствуют границам параметра типа продукта метода [T <: Product] - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу использовать этот код для чтения файла CSV. но это вызывает ошибку обобщения. Почему? Я думаю, что был указан тип как "".

def readMoviesData[T](spark: SparkSession, dataPath: String): Dataset[T] = {
  import spark.implicits._
  spark.read.format("csv").schema(Encoders.product[T].schema)
    .option("header","true").load(dataPath).as[T]
}

def analysisMovies(dataPath: String): Unit = {
  val spark = SparkSession.builder().appName("analysis movies data").getOrCreate()
  val movies: Dataset[MovieModel] = readMoviesData(spark, dataPath + "/movies.csv")
  movies.createOrReplaceTempView("movies")
  spark.sql("select count(*) from movies")
}

ошибка

Error:(10, 53) type arguments [T] do not conform to method product's type parameter bounds [T <: Product]
spark.read.format("csv").schema(Encoders.product[T].schema)

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Сообщение об ошибке гласит:

product ожидает, что его параметр типа является подтипом Product, но ваш параметр типа является неограниченным и, следовательно, может быть любым, включая что-то, что не является подтипом из Product.

Итак, один из способов решения этой проблемы - убедиться, что вы ограничиваете T в подтипе Product.

1 голос
/ 08 апреля 2020

попробуйте добавить Product : TypeTag в T-границах и использовать неявный кодировщик для T:

import scala.reflect.runtime.universe.TypeTag
def readMoviesData[T <: Product : TypeTag](spark: SparkSession, dataPath: String): Dataset[T] = {
  implicit val encoder: Encoder[T] = Encoders.product[T]
  spark.read.format("csv").schema(encoder.schema)
    .option("header","true").load(dataPath).as[T]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...