web-dev-qa-db-fra.com

Comment créer un Spark Dataset à partir d'un RDD

J'ai un RDD[LabeledPoint] destiné à être utilisé dans un pipeline d'apprentissage automatique. Comment convertir ce RDD en DataSet? Notez le plus récent spark.ml les apis nécessitent des entrées au format Dataset.

14
javadba

Voici une réponse qui traverse une étape supplémentaire - le DataFrame. Nous utilisons le SQLContext pour créer un DataFrame puis un DataSet en utilisant le type d'objet souhaité - dans ce cas un LabeledPoint:

val sqlContext = new SQLContext(sc)
val pointsTrainDf =  sqlContext.createDataFrame(training)
val pointsTrainDs = pointsTrainDf.as[LabeledPoint]

Mise à jour Avez-vous déjà entendu parler d'un SparkSession? (moi non plus jusqu'à présent ..)

Donc, apparemment, le SparkSession est le chemin préféré (TM) dans Spark 2.0.0 et aller de l'avant. Voici le code mis à jour pour le nouvel ordre mondial (étincelle):

Approches Spark 2.0.0+

Remarquez que dans les deux approches ci-dessous (une plus simple dont credit @ zero323), nous avons réalisé des économies importantes par rapport à l'approche SQLContext: il n'est plus nécessaire de créer d'abord un DataFrame.

val sparkSession =  SparkSession.builder().getOrCreate()
val pointsTrainDf =  sparkSession.createDataset(training)
val model = new LogisticRegression()
   .train(pointsTrainDs.as[LabeledPoint])

Deuxième voie pour Spark 2.0.0 + Crédit à @ zero323

val spark: org.Apache.spark.sql.SparkSession = ???
import spark.implicits._

val trainDs = training.toDS()

Traditionnel Spark 1.X et approche antérieure

val sqlContext = new SQLContext(sc)  // Note this is *deprecated* in 2.0.0
import sqlContext.implicits._
val training = splits(0).cache()
val test = splits(1)
val trainDs = training**.toDS()**

Voir aussi: Comment stocker des objets personnalisés dans Dataset? par le estimé @ zero323.

18
javadba