繁体   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