我们应该并行化DataFrame,就像我们在训练之前并行化Seq

时间:2016-05-31 23:02:33

标签: scala apache-spark pyspark apache-spark-sql apache-spark-ml

考虑这里给出的代码,

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)

假设我们阅读"培训"作为使用sqlContext.read()的数据帧,应该 我们仍然会做类似

的事情
val model1 = lr.fit(sparkContext.parallelize(training)) // or some variation of this

或fit函数将在传递dataFrame时自动处理并行化计算/数据

此致

2 个答案:

答案 0 :(得分:11)

DataFrame是一种分布式数据结构。 parallelize它既不是必需也不可能。 SparkConext.parallelize方法仅用于驻留在驱动程序内存中的分布式本地数据结构。您不应该习惯于分发大型数据集,更不用说重新分发RDDs或更高级别的数据结构(就像您在上一个问题中所做的那样)

sc.parallelize(trainingData.collect()) 

如果您想在RDD / DataframeDataset)之间进行转换,请使用专门设计的方法:

  1. DataFrameRDD

    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. RDDDataFrame

    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
    

答案 1 :(得分:1)

您应该查看RDD和DataFrame之间的区别以及如何在两者之间进行转换:Difference between DataFrame and RDD in Spark

直接回答您的问题:DataFrame已针对并行执行进行了优化。你不需要做任何事情,你可以直接将它传递给任何spark估算器fit()方法。并行执行在后台处理。