web-dev-qa-db-ja.com

トレーニング前にSeqを並列化するようにDataFrameを並列化する必要があります

ここに与えられたコードを考えてください、

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が渡されると、計算/データの並列化を自動的に処理します

よろしく、

8
Abhishek

DataFrameは分散データ構造です。 parallelizeする必要はなく、実行することもできません。 SparkConext.parallelizeメソッドは、ドライバーのメモリにある分散ローカルデータ構造にのみ使用されます。 (前の質問で行ったように)RDDs以上のレベルのデータ構造を再配布することは言うまでもなく、大きなデータセットを分散することに慣れてはいけません。

sc.parallelize(trainingData.collect()) 

RDD/DataframeDataset)の間で変換したい場合は、それを行うように設計されたメソッドを使用します。

  1. 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
    
13
zero323

RDDとDataFrameの違いと、その2つの変換方法を確認する必要があります。 SparkでのDataFrameとRDDの違い

質問に直接回答するには:DataFrameはすでに並列実行用に最適化されています。何もする必要はなく、任意のspark estimators fit()メソッドに直接渡すことができます。並列実行はバックグラウンドで処理されます。

2
Timomo