web-dev-qa-db-fra.com

Devons-nous paralléliser un DataFrame comme nous parallélisons une Seq avant de former

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,

5
Abhishek

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:

  1. 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
    
  2. 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
    
9
zero323

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.

1
Timomo