Я подключаюсь с Zeppelin к моему rest веб-сервису, который возвращает города, через OpenAPI:
import java.util.Map;
import fr.ecoemploi.application.etude.swagger.model.Commune;
import fr.ecoemploi.application.etude.swagger.api.CogControllerApi;
var serviceCodeOfficielGeographique: CogControllerApi = new CogControllerApi();
var communes: Map[String, Commune] =
serviceCodeOfficielGeographique.obtenirCommunesUsingGET(2022);
он возвращает удовлетворительные результаты:
communes: java.util.Map[String,fr.ecoemploi.application.etude.swagger.model.Commune] =
{62001=class Commune {
arrondissement: 627
codeCanton: 6217
codeCommune: 62001
codeCommuneParente: null
codeDepartement: 62
codeEPCI: 246200364
codeRegion: 32
collectiviteOutremer: false
nomCommune: Ablain-Saint-Nazaire
nomMajuscules: ABLAIN SAINT NAZAIRE
population: null
sirenCommune: 216200014
...
Я хотел бы сохранить города (значения этой карты, которые я поймаю с помощью communes.values()) в Dataset[Commune].
Но мне интересно, как это сделать.
Я пытался:
import org.apache.spark.sql._
var datasetCommunes = spark.createDataset(communes, Encoders[Commune]);
под Цеппелином, но получил сообщение:
<console>:96: error: object Encoders does not take type parameters.
var datasetCommunes = spark.createDataset(communes, Encoders[Commune]);
Я не знаю, как написать свое заявление.
Спасибо за ваш совет ниже, @Gael_J.
Я пробовал это таким образом (потому что map.values() возвращает в Java Collection<Commune>, который я должен сначала преобразовать в java.util.List:
import org.apache.spark.sql._
import scala.collection.mutable._;
import spark.implicits._
var communeList: ArrayBuffer[Commune] = new ArrayBuffer[Commune];
communes.values().stream().forEach(commune => communeList.append(commune));
var datasetCommunes = communeList.toSeq.toDS();
Но я получаю сообщение об ошибке:
error: value toDS is not a member of Seq[fr.ecoemploi.application.etude.swagger.model.Commune]
var datasetCommunes = communeList.toSeq.toDS();





Если Commune является классом case, вы сможете извлечь выгоду из автоматических Encoder с чем-то вроде этого:
import spark.implicits._
val ds = communes.values().toSeq().toDS()
Может быть, это не работает, потому что остальные API отправляют классы Java? А не бывает занятия?
Скорее всего да. Я не знаю, как Spark может обрабатывать классы Java. Если вы собираетесь работать со Spark в Scala, возможно, в любом случае стоит преобразовать их в классы case. Или, может быть, использовать Spark Java в первую очередь?
На самом деле, я не был умным: вместо того, чтобы просить openapi-generator-maven-plugin сгенерировать для меня классы-заглушки Java, лучше было попросить его сгенерировать несколько классов Scala! Кроме того, они удобно представляют собой классы case.
Я добавлю к ответу @GaëlJ, что если Commune является POJO, то это должен быть bean-компонент, и вы должны вручную определить его кодировщик
import spark.implicits._
implicit val enc = Encoders.bean(classOf[Commune])
Seq(new Commune(...)).toDS()
Спасибо! Я отредактировал свое сообщение, чтобы отразить попытку, которую я сделал. Но он отвечает, что в Seq нет метода toDS().