Не влияет на аргументы типа T. Попытка привести кадр данных к набору данных [T] - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь создать обобщенную функцию c для консолидации некоторых коллекций mongoDb, я использую классы case для ввода коллекций, и в своей функции я получаю тип в качестве параметра [T], например:

  def refreshCollection[T](newDS:Dataset[T],oldDS:Dataset[T]): Dataset[T]={
    val filteredOldDS=oldDS.join(newDS, Seq("id"),"left_anti").as[T]
    filteredOldDS.union(newDS)
  }

Проблема в том, что когда я пытаюсь преобразовать результат Dataframe объединения в исходный класс case, используя .as[T], чтобы вернуть Dataset[T] У меня есть эта ошибка, даже если я импортировал sparkSession.implicits._:

no implicit arguments of type: Encoder[T]

Интересно, что когда я делаю конвертацию с классом с фиксированным регистром, все в порядке, какой-нибудь совет по этому поводу?

Заранее спасибо!

1 Ответ

4 голосов
/ 07 февраля 2020

Я полагаю, это потому, что ваш код не гарантирует, что при необходимости будет доступно Encoder[T].

Вы можете попытаться параметризовать ваш неявный декодер и отложить момент, когда компилятор попытается найти требуется декодер.

  def refreshCollection[T](newDS:Dataset[T],oldDS:Dataset[T])(implicit enc: Encoder[T]): Dataset[T]={
    val filteredOldDS=oldDS.join(newDS, Seq("id"),"left_anti").as[T]
    filteredOldDS.union(newDS)
  }

Конечно, вам нужно будет каким-то образом ввести в область действия Encoder[MyCaseClass] при вызове refreshCollection

...