考虑这里给出的代码,
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时自动处理并行化计算/数据
此致
答案 0 :(得分:11)
DataFrame
是一种分布式数据结构。 parallelize
它既不是必需也不可能。 SparkConext.parallelize
方法仅用于驻留在驱动程序内存中的分布式本地数据结构。您不应该习惯于分发大型数据集,更不用说重新分发RDDs
或更高级别的数据结构(就像您在上一个问题中所做的那样)
sc.parallelize(trainingData.collect())
如果您想在RDD
/ Dataframe
(Dataset
)之间进行转换,请使用专门设计的方法:
从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
答案 1 :(得分:1)
您应该查看RDD和DataFrame之间的区别以及如何在两者之间进行转换:Difference between DataFrame and RDD in Spark
直接回答您的问题:DataFrame已针对并行执行进行了优化。你不需要做任何事情,你可以直接将它传递给任何spark估算器fit()方法。并行执行在后台处理。