ここに与えられたコードを考えてください、
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が渡されると、計算/データの並列化を自動的に処理します
よろしく、
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
RDDとDataFrameの違いと、その2つの変換方法を確認する必要があります。 SparkでのDataFrameとRDDの違い
質問に直接回答するには:DataFrameはすでに並列実行用に最適化されています。何もする必要はなく、任意のspark estimators fit()メソッドに直接渡すことができます。並列実行はバックグラウンドで処理されます。