簡體   English   中英

將 POJO 存儲到 Spark 數據集

[英]Store POJOs to a Spark Dataset

我正在將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
 ...

我想將城市(這個 map 的值,我將使用communes.values()捕獲)存儲到Dataset[Commune]中。

但我想知道如何做到這一點。
我試過:

import org.apache.spark.sql._

var datasetCommunes = spark.createDataset(communes, Encoders[Commune]);

Zeppelin下,但收到消息:

<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是一個案例 class,您應該能夠從自動Encoder中受益,如下所示:

import spark.implicits._

val ds = communes.values().toSeq().toDS()

我將添加到@GaëlJ 的回答中,如果Commune是一個 POJO,那么它應該是一個 bean,你應該手動定義它的編碼器

import spark.implicits._

implicit val enc = Encoders.bean(classOf[Commune])

Seq(new Commune(...)).toDS()

使用 Java 類的 Spark Scala 數據集

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM