Considérons le code donné ici,
https://spark.Apache.org/docs/1.2.0/ml-guide.html
import org.Apache.spark.ml.classification.LogisticRegression
val training = sparkContext.parallelize(Seq(
LabeledPoint(1.0, Vectors.dense(0.0, 1.1, 0.1)),
LabeledPoint(0.0, Vectors.dense(2.0, 1.0, -1.0)),
LabeledPoint(0.0, Vectors.dense(2.0, 1.3, 1.0)),
LabeledPoint(1.0, Vectors.dense(0.0, 1.2, -0.5))))
val lr = new LogisticRegression()
lr.setMaxIter(10).setRegParam(0.01)
val model1 = lr.fit(training)
En supposant que nous lisions "training" comme un cadre de données utilisant sqlContext.read (), devrions-nous toujours faire quelque chose comme:
val model1 = lr.fit(sparkContext.parallelize(training)) // or some variation of this
ou la fonction fit s'occupera automatiquement de mettre en parallèle le calcul/les données quand un dataFrame est passé
Cordialement,
DataFrame
est une structure de données distribuée. Il n'est ni nécessaire ni possible de parallelize
. La méthode SparkConext.parallelize
est utilisée uniquement pour les structures de données locales distribuées qui résident dans la mémoire du pilote. Vous ne devriez pas être utilisé pour distribués grands ensembles de données pour ne pas mentionner la redistribution RDDs
ou des structures de données de niveau supérieur (comme vous le faites dans votre question précédente)
sc.parallelize(trainingData.collect())
Si vous voulez convertir entre RDD
/Dataframe
(Dataset
) utiliser des méthodes qui sont conçues pour le faire:
de DataFrame
à RDD
:
import org.Apache.spark.sql.DataFrame
import org.Apache.spark.sql.Row
import org.Apache.spark.rdd.RDD
val df: DataFrame = Seq(("foo", 1), ("bar", 2)).toDF("k", "v")
val rdd: RDD[Row] = df.rdd
RDD
à DataFrame
:
val rdd: RDD[(String, Int)] = sc.parallelize(Seq(("foo", 1), ("bar", 2)))
val df1: DataFrame = rdd.toDF
// or
val df2: DataFrame = spark.createDataFrame(rdd) // From 1.x use sqlContext
Vous devriez peut-être vérifier la différence entre RDD et DataFrame et savoir comment convertir entre les deux: Différence entre DataFrame et RDD dans Spark
Pour répondre directement à votre question: Un DataFrame est déjà optimisé pour une exécution parallèle. Vous n'avez rien à faire et vous pouvez le transmettre directement à n'importe quelle méthode fit () d'estimateurs par étincelle. Les exécutions parallèles sont traitées en arrière-plan.